Java語言有好些個名詞,讓人望而生畏。
上智不教即知,下愚雖教無益,中庸之人,不教不知。
人的天性中就有一點對未知的恐懼。
剛開始不了解,也沒認真看,發現好難呀;等,靜下心來自己研究,再看其實不難,發現都是紙老虎,不堪一擊。
今天就來分析一下反射:Reflection
看一下維基百科的解釋:
在諸如Java之類的面向對象的程式設計語言中,反射允許在程式運作期間通路 類、接口、字段和方法,而不必在編譯期間知道接口、字段或者方法的名稱。
反射也允許執行個體化對象和調用方法。
總結三點:
第一:反射可以擷取類、接口、字段和方法的資訊。
第二:不止new可以建立對象,反射也可以執行個體化對象。
第三:通過反射實作對方法的調用。
對于建立對象或者調用方法:正常的步驟是先用new關鍵詞,造一個對象,然後再使用此對象的引用去調用方法,這是正常的套路。
反射就是不按正常套路來,但是殊途同歸,本來可以一步到位的東西,他要分幾個詳細的步驟或者繞個彎走。而他的先擷取Class類對象,再去建立對象仿佛就是分步走。
然後通過Class類對象擷取Method,然後通過Method的invoke方法調用對象的方法就是在繞個彎。
首先要建立一個Reflection測試類
使用反射建立對象,用new建立對象就沒必要再說了。JavaAPI為反射機制提供了一些類包括Class和java.lang.reflect包下的類。
(1)第一種方式:使用Class類的forName靜态方法,可以擷取一個類對象,然後調用類對象的newInstance方法建立對象。
(2)第二種方式:直接使用類名.class擷取類對象,然後調用類對象的newInstance方法建立對象。
使用反射,擷取類的public方法,并嘗試調用類的方法。
(1)首先通過反射擷取類對象,通過類對象的getMethods方法,擷取類的所有public方法Method[]。
Method是java.lang.reflect包下的類:提供某個 類、接口 的單一方法資訊,提供對方法的通路。這個反射方法可以擷取類方法或者執行個體方法。
循環輸出方法名,可以看到,不止test1、3還有equals、hashCode等繼承Object的方法。
但是并沒有test2,因為他不是public類型的方法。
(2)使用Method的invoke調用方法test1和hashCode
(3)也可以使用getMethod擷取Method,不過要注意其參數
第一個參數:方法名
第二個參數:此方法參數的類型集合
使用反射,擷取類的public字段,和擷取方法類似,也有兩個方法,一個是擷取所有的public字段,另一個是擷取某個public字段
使用反射,擷取類和方法的注解。(Retention(RetentionPolicy.RUNTIME),RUNTIME類型的才能擷取到)
(1)擷取類的注解
(2)擷取方法的注解