-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
反射是为了解决在运行期,对某个实例一无所知的情况下,如何调用其方法。
如何获取class
每加载一种class,JVM就为其创建一个Class类型的实例,并关联起来。注意:这里的Class类型是一个名叫Class的class.
一个Class实例包含了该class的所有完整信息:
┌───────────────────────────┐
│ Class Instance │──────> String
├───────────────────────────┤
│name = "java.lang.String" │
├───────────────────────────┤
│package = "java.lang" │
├───────────────────────────┤
│super = "java.lang.Object" │
├───────────────────────────┤
│interface = CharSequence...│
├───────────────────────────┤
│field = value[],hash,... │
├───────────────────────────┤
│method = indexOf()... │
└───────────────────────────┘
获取class实例的方法
// 1. 直接通过一个class的静态变量class获取:
Class cls1 = String.class;
// 2. 如果我们有一个实例变量,可以通过该实例变量提供的getClass()方法获取:
String s = "Hello";
Class cls2 = s.getClass();
// 3. 如果知道一个class的完整类名,可以通过静态方法Class.forName()获取:
Class cls3 = Class.forName("java.lang.String");
printClassInfo(cls1)
printClassInfo(cls2)
printClassInfo(cls3)
// 因为Class实例在JVM中是唯一的,所以,上述方法获取的Class实例是同一个实例。可以用==比较两个Class实例
boolean sameClass = cls1 == cls2;
// 打印信息
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());
}
// 获取String的Class实例:
Class cls = String.class;
// 创建一个String实例: 上述代码相当于new String()。通过Class.newInstance()可以创建类实例,它的局限是:只能调用public的无参数构造方法。带参数的构造方法,或者非public的构造方法都无法通过Class.newInstance()被调用。
String s = (String) cls.newInstance();Metadata
Metadata
Assignees
Labels
No labels