Java反射-獲取一個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");

因爲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實例時,我們可以通過反射獲取該Objectclass信息:

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());
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章