天天看點

Java 反射學習筆記

要學反射,先要了解class這個類,class是所有java類的一個總稱,class的執行個體中存儲的是一個類的位元組碼,擷取class的執行個體有三種方式:

system.class

new date().getclass()

class.forname(“java.lang.string”);

java不允許使用class cla = new class()這種方式獲得一個class的新執行個體,因為class的構造方法是私有的,看一段源代碼:

Java 反射學習筆記

這段源碼裡說的很明白,隻有jvm才可以建立一個class對象。

那麼這三種擷取class執行個體的方式有什麼差別呢?

輸出結果為:

Java 反射學習筆記

根據這結果我們可以推論出,用這三種方式獲得的class執行個體是一模一樣的,但是在實際的開發中我們更多的是使用第三種方式來獲得一個class執行個體,比如spring架構,我們先在配置檔案中寫好類名,然後在程式運作的過程中動态加載,獲得該類的執行個體,再執行方法(spring的工作原理基本就這樣)。

那麼反射是什麼?這是别人總結的“反射就是把java類中的各種成分映射成相應的java類(比如 屬性–>field、方法–>method、構造方法–>contructor、包–>package)”。拿到這些相應的java類之後該怎麼用?這是反射學習的重點。

1.constructor類

1.1 如果想調用一個類的預設無參構造方法,有以下兩種方式:

方式一,直接執行個體化一個class(這種方式隻能調用無參構造方法):

輸出結果:

Java 反射學習筆記

utils.java

方式二,先獲得一個constructor類,再根據這個類調用無參構造方法。

Java 反射學習筆記

1.2 調用一個有參的構造方法

Java 反射學習筆記

2.獲得field并檢視相應的執行個體對象的值,細節都已經在注釋中說明:

3.擷取一個類中的所有string類型的屬性,如果該字段的值中有’a’,則全部替換為’b’:

point.java

4.通過反射調用方法

5.通過反射調用一個方法的main(string[] args)方法:

reflectmain.java

6.使用反射類列印一個普通對象或者數組對象:

7.利用反射實作一個間的spring架構

方式一:

config.properties

方式二:

config.xml

8.使用classloader加載一個配置檔案:

繼續閱讀