方法一:直接通過一個class
的靜態變量class
獲取:
Class cls = String.class;
方法二:如果我們有一個實例變量,可以通過該實例變量提供的getClass()
方法獲取:
String s = "Hello";
Class cls = s.getClass();
方法三:如果知道一個class
的完整類名,可以通過靜態方法Class.forName()
獲取:
Class cls = Class.forName("java.lang.String");
因爲Class
實例在JVM中是唯一的,所以,上述方法獲取的Class
實例是同一個實例。可以用==
比較兩個Class
實例:
Class cls1 = String.class;
String s = "Hello";
Class cls2 = s.getClass();
boolean sameClass = cls1 == cls2; // true
用instanceof
不但匹配指定類型,還匹配指定類型的子類。而用==
判斷class
實例可以精確地判斷數據類型,但不能作子類型比較。
通常情況下,我們應該用instanceof
判斷數據類型,因爲面向抽象編程的時候,我們不關心具體的子類型。只有在需要精確判斷一個類型是不是某個class
的時候,我們才使用==
判斷class
實例。
因爲反射的目的是爲了獲得某個實例的信息。因此,當我們拿到某個Object
實例時,我們可以通過反射獲取該Object
的class
信息:
void printObjectInfo(Object obj) {
Class cls = obj.getClass();
}
要從Class
實例獲取獲取的基本信息,參考下面的代碼:
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());
}
}