JAVA反射機制是在運作狀态中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動态擷取的資訊以及動态調用對象的方法的功能稱為Java語言的反射機制。
反射(Reflection)是Java程式開發語言的特征之一,它允許運作中的Java程式對自身進行檢查, 也稱自審,并能直接操作程式的内部屬性。例如,使用它能獲得Java類中各成員的名稱并顯示出來。
Java的這一能力在實際應用中應用得很多,在其它的程式語言中根本就不存在這一特性。例如,Pascal、C或者C++中就沒有辦法在程式中獲得函數定義相關的資訊。
JavaBean是類反射的實際應用之一,它能讓一些工具可視化的操作軟體元件。這些工具通過類反射動态的載入并取得Java元件(類)的屬性。後面學習的各種架構,基本上都會有反射的使用。
最簡單的類反射:(相當于HelloWorld)
Person類:
輸出結果:
USB接口:
實作類:
工廠方法:!!!讀取配置檔案的在這裡
main方法:
你配置哪個,就是new哪個實作類的!!
‘#’号是配置檔案的注釋
用于反射的類,如Method,可以在java.lang.reflect包中找到。使用這些類的時候必須要遵循三個步驟:
第一步:獲得你想操作的類的java.lang.Class對象。在運作中的Java程式中,用java.lang.Class類來描述類和接口等。
第二步:調用諸如getDeclaredMethods的方法,取得該類中定義的所有方法的清單。
第三步:使用反射的API來操作這些資訊。
如下面這段代碼:
Class c = Class.forName(“java.lang.String”);
Method ms[] = c.getDeclaredMethods();
System.out.println(ms[0].toString());
它将以文本方式列印出String中定義的第一個方法的原型。
反射示例(模拟instanceof的功能)
方式一
通過對象的getClass方法進行擷取。這種方式需要具體的類和該類的對象,以及調用getClass方法。
方式二
任何資料類型(包括基本資料類型)都具備着一個靜态的屬性class,通過它可直接擷取到該類型對應的Class對象。這種方式要使用具體的類,然後調用類中的靜态屬性class完成,無需調用方法,性能更好。
方式三
通過Class.forName()方法擷取。這種方式僅需使用類名,就可以擷取該類的Class對象,更有利于擴充。
下面看怎麼擷取Class對象的代碼:
運作結果在輸出後面都注釋了。。。
代碼示範:
找出一個類中定義了些什麼方法,這是一個非常有價值也非常基礎的反射用法。
運作結果太長了,自己可以運作看看!
找出一個類中定義的構造方法,構造器沒有傳回類型。
找出一個類中定義了哪些屬性字段。
Class類真的很強大!