初識Java反射機制:
從上面的描述可以看出Java的反射機制使得Java語言可以在運行時去認識在編譯時並不了解的類/對象的信息,並且能夠調用相應的方法或修改屬性的值。Java反射機制的核心就是允許在運行時通過Java Reflection APIs來取得已知名字的class類的內部信息(包括其modifiers(如public, static等)、superclass(如Object)、interfaces(如Serializable),也包括fields和methods的所有信息),動態地生成此類,並調用其方法或修改其域(甚至是本身聲明為private的域或方法)。這種反射機制為Java本身帶來了動態性,是一個非常強大的工具,能夠讓代碼變得更加靈活。
簡單示例:
細說Java反射機制:
此處參考了這篇文章:Java反射機制 http://blog.csdn.net/jackiehff/article/details/8509075
(1)Class對象
Class對象是Java反射的基礎,它包含了與類相關的信息,實際上,Class對象是用來創建類的所有對象的。Class對象是java.lang.Class<T>這個類生成的對象,其中參數T表示用此Class對象建模的類的類型。例如,String.class的類型是 Class<String>;如果被建模的類的類型未知,則使用Class<?>,下圖有所體現:
以下是Java API
的描述:
Class
類的實例表示正在運行的 Java應用程序中的類和接口。基本的Java類型(boolean
、byte
、char
、short
、int
、long
、float
和double
)和關鍵字void也
表示為Class
對象。所有具有相同元素類型和維數的數組都共享同一個Class
對象。
實際上,每個類都有一個Class對象。換言之,每當編寫並且編譯了一個新類,就會產生一個Class對象(更恰當的說,是被保存在一個同名的.class文件中)。如果我們想生成某個類的對象,運行這個程序的虛擬機(JVM)將使用類加載器檢查這個類的Class對象是否已經加載。如果尚未加載,默認的類加載器就會根據類名查找.class文件,並將其載入,一旦某個類的Class對象被載入內存,它就被用來創建這個類的所有對象。
Class
沒有公共構造方法,Class
對象是在加載類時由Java虛擬機以及通過調用類加載器中的defineClass
方法自動構造的。
獲取Class對象有三種方式:
A、通過實例變量的getClass()方法。
示例:Class c = new String("abc").getClass();
B、通過Class類的靜態方法——forName()來實現。
示例:Class c =Class.forName("className");
注:當使用Class.forName()方法時,你必須提供完整類名(即類名要包括包名)。例如,如果MyObject是位於包com.test下,那麼類的完整類名是com.test.MyObject。如果運行時在類路徑上找不到指定的類,Class.forName()方法會拋出一個ClassNotFoundException。
C、使用類字面常量或TYPE字段。
示例:Class c = MyObject.class;
注:類字面常量不僅可以應用於普通的類,也可以應用於接口、數組以及基本數據類型,這種方式不僅更簡單,而且更安全,因為它在編譯時就會受到檢查,並且根除了對forName方法的調用,所以也更高效,建議使用“.class”的形式。