Reflection java

Reflection應用與實作

張凱欽Jimmy chang 2020/12/31 13:02:58
81

1.簡介

在Java有時需要取得物件的類別具備那些 field, method 等基本訊息,就可以透過Reflection實現,除此之外還能夠動態的載入未知的類別。並實例化,可以呼叫 methods 來進行各種 Getter, Setter的動作。

透過Reflection動態的特性可以為程式注入許多的彈性,許多的框架,像是Hibernate, Spring, Struts等都有使用到Reflection去實現。

 

2.使用方式

使用Java Reflection不需要額外Include新的jar檔,在Package java.lang.reflect內就有許多API可以使用,只需要Import近來即可。

附上下方使用的Java Reflection API簡易說明:

forName() 獲取Class對象

newInstance()返回一個生成實例

getDeclaredFields()取得所有屬性Field 

getDeclaredField(String name)取得指定的屬性名稱

getCanonicalName()類別名稱(含package)

getSimpleName()類別名稱

getPackage().getName()package名稱

getModifiers()modifier名稱

getConstructors()取得該類別的建構子陣列

getDeclaredMethods()取得該類別的方法陣列

2.1使用案例

建立表單物件 包含姓名 年齡 性別

使用reflection API取得類別相關資訊

執行結果顯示各API回傳的資料

3.應用與實作

以問券填寫的案例來說明,利用JAVA的反射設機制,如何將類別解析與載入內容與延伸應用。

當需要將資料寫入表單時,可以直接Set值到物件中

3.1情境1

而當表單需要新增新的內容,例如:新增使用者的填寫的問卷內容,會在物件中增加新的類別

而在Set值時也需要增加相對應的Setting

3.2情境2假如現在要增加問券題目時就會變成下方的情況

而在Set值時,同樣也需要增加相對應的Setting

可是在這樣的情況下,只要有新增內容就必須跟著調整Setting的部分,如果繼續增加Setting的部分就會越來越多。

3.3實作案例一-動態載入

延續上方的情境調整成Reflection動態的方式去對應

*answer設定為使用者填寫的答案

透過下方的調整

透過上的程式碼,將寫入值得物件內容列印在Consloe上,可以看到透過reflection動態的將使用者填寫的內容依序放到相對應的屬性上

3.4實作案例二-轉JSON

延續上方的情境

也可以應用在轉JSON上

將3.3實作案例一回傳的物件轉成JSON,一樣透過Reflection的API取得物件的方法名稱、屬性值等資訊寫入JSONObject的物件中

透過上方的程式碼,即可得到動態轉換後的結果

4.結論

Reflection十分動態的特性,可以為程式注入許多的彈性。

未使用Reflection的程式碼,物件所需類別無法在執行時再決定,靈活度相對較低,相反的使用Reflection機制,它的動態讓程式碼不需寫死,降低耦合性,提高自適應能力,能夠更彈性的執行程式。

但Reflection在效能上,相對直接的程式碼較差且在可讀性上更為複雜,可能造成後續維護等相關問題,所以在使用上需要有所斟酌。

 

5.參考文件

Java技術手冊

https://akuma1.pixnet.net/blog/post/230805886-%E5%9F%BA%E7%A4%8E%E8%A8%93%E7%B7%B4%EF%BC%8D%EF%BC%8D%2806%29java-reflection%EF%BC%88%E6%98%A0%E5%B0%84%EF%BC%89%E8%88%87%E5%91%BD%E5%90%8D

https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/98819/

https://akuma1.pixnet.net/blog/post/230805886-%E5%9F%BA%E7%A4%8E%E8%A8%93%E7%B7%B4%EF%BC%8D%EF%BC%8D%2806%29java-reflection%EF%BC%88%E6%98%A0%E5%B0%84%EF%BC%89%E8%88%87%E5%91%BD%E5%90%8D

http://hsingjungchen.blogspot.com/2017/06/javareflection.html

https://matthung0807.blogspot.com/2018/08/java-reflection.html

https://blog.xuite.net/evan_0412/wretch/169912551

https://www.baeldung.com/java-reflection

 

張凱欽Jimmy chang