Java學習筆記(二)—— 反射

Java-reflect專題
– Class類的使用方式
– 在面向對象中萬物皆對象
– 除去基本數據類型 和 靜態 ,但是基本數據類型有包裝類,靜態的東西屬於類,類似於靜態的常量
– 基本數據類型不是對象
– 靜態的東西屬於類,不是對象
– 類屬於也屬於對象,類對象,類屬於Java.lang.Class類的實例對象
– there is a class named Class
– 現在有一個類的名字就是Class,在Java中每一個存在的類就是這個類的實例
– 方法的反射
– 成員變量的反射
– 構造函數的反射
– Java類加載機制

package reflect;

public class ClassDemo {

    public static void main(String[] args) {
        // Foo 的對象怎麼表示
        Foo foo = new Foo();
        // 但是Foo() 這個類也是一個實例對象,這個類是java.lang.Class這個類的實例對象
        // 如何表示表示Class類的實例對象 不能夠通過new得到Class類的實例對象
        // 通過java.lang.Class的源碼可以看到這個類是不能夠使用構造方法來創建實例對象的
        // 因爲源碼裏面的構造器是私有的,只有JVM才能夠使用創建這個類的實例對象

        /**
         * 任何一個類都是Class的實例對象,這個實例對象有三種表現方式
         * 
         */
        // 第一種方式--> 實際上在告訴我們任何一個類都有一個隱含的靜態變量class
        Class<?> class1 = Foo.class;

        // 第二種方式 --> 已經知道該類的對象通過調用getClass()
        Class<?> class2 = foo.getClass();

        /**
         * 官方說法: class1 class2表示了Foo類的類類型(class Type) 類類型 class1 class2 萬事萬物皆對象 累也是對象
         * 是Class類的實例對象 這個對象我們稱之爲該類的類類型
         */
        // 不管class1 還是 class2 都代表了Foo類的類類型,一個類只可能夠是Class類的一個實例對象
        System.out.println(class1 == class2); // true

        // 第三種方式 -->
        Class<?> class3 = null;
        try {
            // 這裏Class.forName參數爲當前類的全稱,Foo在包reflect包當中就寫reflect.Foo
            // 注意這裏反射的是類Foo 不是 ClassDemo
            class3 = Class.forName("reflect.Foo");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        // 因爲一個類只可能是Class類的一個實例對象
        System.out.println(class2 == class3);

        // 我們完全可以通過該類的類類型創建愛該類的對象
        // 通過class1 class2 class3創建類Foo的對象,使用類類型的newInstance() 方法
        // 這個class1 是誰的類類型 創建出來的就是誰的對象,在這裏class1 是Foo類的類類型,創建出來的就是Foo類的對對象
        try {
            class1.newInstance();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 


    }
}

class Foo {

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