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 {
}