那麼什麼是Java的反射呢。
大家都知道,要讓Java程式能夠運行,那麼就得讓Java類要被Java虛擬機器載入。Java類如果不被Java虛擬機器載入,是不能正常啟動並執行。現在我們啟動並執行所有的程式都是在編譯期的時候就已經知道了你所需要的那個類的已經被載入了。
Java的反射機制是在編譯並不確定是哪個類被載入了,而是在程式啟動並執行時候才載入、探知、自審。使用在編譯期並不知道的類。這樣的特點就是反射。
那麼Java反射有什麼作用呢。
假如我們有兩個程式員,一個程式員在寫程式的時候,需要使用第二個程式員所寫的類,但第二個程式員並沒完成他所寫的類。那麼第一個程式員的代碼能否通過編譯呢。這是不能通過編譯的。利用Java反射的機制,就可以讓第一個程式員在沒有得到第二個程式員所寫的類的時候,來完成自身代碼的編譯。
Java的反射機制它知道類的基本結構,這種對Java類結構探知的能力,我們稱為Java類的“自審”。大家都用過Jcreator和eclipse。當我們構建出一個對象的時候,去調用該對象的方法和屬性的時候。一按點,編譯工具就會自動的把該對象能夠使用的所有的方法和屬性全部都列出來,供使用者進行選擇。這就是利用了Java反射的原理,是對我們建立對象的探知、自審。
Class類
要正確使用Java反射機制就得使用java.lang.Class這個類。它是Java反射機制的起源。當一個類被載入以後,Java虛擬機器就會自動產生一個Class對象。通過這個Class對象我們就能獲得載入到虛擬機器當中這個Class對象對應的方法、成員以及構造方法的聲明和定義等資訊。
上半部分轉自這裡。 Class類的使用
物件導向,萬事萬物皆對象。
java語言中,兩種不物件導向:靜態成員、普通資料類型類
類是對象,類是java.lang.Class類的執行個體對象。
任何一個類都是Class的實力類。
Class類由java virtual machine虛擬機器建立。
Class類擷取的執行個體對象表示了執行個體類的類類型(Class type) Class類動態載入類的使用
動態載入:運行時刻載入類 Class.forName("類的名稱"); 優點:用的時候調用不影響程式運行。
靜態記載:編譯時間刻載入類 new建立對象是靜態載入類。
用動態載入的方法執行個體化多個相似類,可以建立一個介面,讓這些相似類實現這個介面,只建立這個介面類的對象即可。
使用Class.forName( )靜態方法的目的是為了動態載入類。在載入完成後,一般還要調用Class下的newInstance( )靜態方法來執行個體化對象以便操作。因此,單單使用Class.forName( )是動態載入類是沒有用的,其最終目的是為了執行個體化對象。 詳見java中newInstance()和new()的區別
Java擷取方法資訊
方法的反射
方法反射的操作:method.invoke(對象,參數列表) 當然前提是擷取到方法。
1.擷取類的資訊首先要獲得類的類類型 擷取class對象。 A a = new A(); Class c = a.getClass();
2.方法擷取:名稱和參數來決定 getMethod擷取public方法 getDelcaredMethod自己聲明的方法
Method m=c.getMethod("方法名",參數列表);
方法的反射操作是用m對象來進行方法調用的 本來有a1.print(參數列表);可以進行調用。方法的反射和這個調用的效果完全相同 通過Class,Method來認識泛型的本質
Java中集合的泛型,是防止錯誤輸入,只在編譯階段有效,繞過編譯就無效了。。。例如建立一個String泛型的ArrayList,當向其中添加其他類型數 據時會提示錯誤。
可以通過方法的反射繞過編譯添加資料
ArrayList<String> list = new ArrayList<String>(); Class c=list.getClass(); Method m=c.getMethod("add",Object.class); m.invoke(list,參數資料);
但結果是不能用for-each進行遍曆不然拋異常類型轉換錯誤