概念:
通过Class实例获取class信息的方法称为反射(Reflection)。
int等基本类型外,Java的其他类型(引用数据类型)全部都是class(包括interface、enum)
class(包括interface、enum)的本质是数据类型(Type)。无继承关系的数据类型无法赋值
特征:破坏了封装性
JVM为每个加载的class
及interface
创建了对应的Class
实例来保存class
及interface
的所有信息;
获取一个class
对应的Class
实例后,就可以获取该class
的所有信息;
JVM总是动态加载class
,可以在运行期根据条件来控制加载class。
(使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码))
这种通过 Class实例获取 class信息的方法称为反射(Reflection)。
如何获取一个 class的 Class实例?有三个方法:
方法一:直接通过一个 class的静态变量 class获取:
Class cls = String.class;
方法二:如果我们有一个实例变量,可以通过该实例变量提供的 getClass()方法获取:String s = "Hello";
Class cls = s.getClass();
方法三:如果知道一个 class的完整类名,可以通过静态方法 Class.forName()获取:Class cls = Class.forName("java.lang.String");
public class Main {
public static void main(String[] args) {
printClassInfo("".getClass());
printClassInfo(Runnable.class);
printClassInfo(java.time.Month.class);
printClassInfo(String[].class);
printClassInfo(int.class);
}
static void printClassInfo(Class cls) {
System.out.println("Class name: " + cls.getName());
System.out.println("Simple name: " + cls.getSimpleName());
if (cls.getPackage() != null) {
System.out.println("Package name: " + cls.getPackage().getName());
}
System.out.println("is interface: " + cls.isInterface());
System.out.println("is enum: " + cls.isEnum());
System.out.println("is array: " + cls.isArray());
System.out.println("is primitive: " + cls.isPrimitive());
}
}
输出:
Class name: java.lang.String
Simple name: String
Package name: java.lang
is interface: false
is enum: false
is array: false
is primitive: false
Class name: java.lang.Runnable
Simple name: Runnable
Package name: java.lang
is interface: true
is enum: false
is array: false
is primitive: falseClass name: java.time.Month
Simple name: Month
Package name: java.time
is interface: false
is enum: true
is array: false
is primitive: falseClass name: [Ljava.lang.String;
Simple name: String[]
is interface: false
is enum: false
is array: true
is primitive: falseClass name: int
Simple name: int
is interface: false
is enum: false
is array: false
is primitive: true //基本数据类型
不会点: