要學反射,先要了解class這個類,class是所有java類的一個總稱,class的執行個體中存儲的是一個類的位元組碼,擷取class的執行個體有三種方式:
system.class
new date().getclass()
class.forname(“java.lang.string”);
java不允許使用class cla = new class()這種方式獲得一個class的新執行個體,因為class的構造方法是私有的,看一段源代碼:
這段源碼裡說的很明白,隻有jvm才可以建立一個class對象。
那麼這三種擷取class執行個體的方式有什麼差別呢?
輸出結果為:
根據這結果我們可以推論出,用這三種方式獲得的class執行個體是一模一樣的,但是在實際的開發中我們更多的是使用第三種方式來獲得一個class執行個體,比如spring架構,我們先在配置檔案中寫好類名,然後在程式運作的過程中動态加載,獲得該類的執行個體,再執行方法(spring的工作原理基本就這樣)。
那麼反射是什麼?這是别人總結的“反射就是把java類中的各種成分映射成相應的java類(比如 屬性–>field、方法–>method、構造方法–>contructor、包–>package)”。拿到這些相應的java類之後該怎麼用?這是反射學習的重點。
1.constructor類
1.1 如果想調用一個類的預設無參構造方法,有以下兩種方式:
方式一,直接執行個體化一個class(這種方式隻能調用無參構造方法):
輸出結果:
utils.java
方式二,先獲得一個constructor類,再根據這個類調用無參構造方法。
1.2 調用一個有參的構造方法
2.獲得field并檢視相應的執行個體對象的值,細節都已經在注釋中說明:
3.擷取一個類中的所有string類型的屬性,如果該字段的值中有’a’,則全部替換為’b’:
point.java
4.通過反射調用方法
5.通過反射調用一個方法的main(string[] args)方法:
reflectmain.java
6.使用反射類列印一個普通對象或者數組對象:
7.利用反射實作一個間的spring架構
方式一:
config.properties
方式二:
config.xml
8.使用classloader加載一個配置檔案: