Reflection應用與實作
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