Java 中反射的寫(xiě)法和相關(guān)第三方封裝庫(kù)雖然很多,但筆者還是鐘愛(ài)于 JOOR
烁登,GitHub 鏈接 https://github.com/jOOQ/jOOR。
這個(gè)庫(kù)用了好幾年了,為什么好用饵沧?因?yàn)槠湫∏删孪锹纾∏傻街挥幸粋€(gè) Java 文件,精致到寫(xiě)出來(lái)的代碼很優(yōu)雅狼牺。
首先我們回顧下 Java 原生提供的反射寫(xiě)法羡儿,比如我們想要調(diào) DataManager
的靜態(tài)方法 get
,如下:
try {
final Method m = DataManager.class.getMethod("get", Context.class);
m.setAccessible(true);
m.invoke(null, this);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
而使用 JOOR
的寫(xiě)法如下:
Reflect.on(DataManager.class).call("get", this);
更高大上的用法自己去看下項(xiàng)目文檔吧是钥,反正實(shí)現(xiàn)原理也超級(jí)簡(jiǎn)單掠归,就是對(duì) Java 反射的一次包裝。JOOR
主要提供了 Reflect
和 ReflectException
悄泥,具體如下:
Reflect.on:
包裹一個(gè)類(lèi)或者對(duì)象虏冻,表示在這個(gè)類(lèi)或?qū)ο笊线M(jìn)行反射,類(lèi)的值可以是Class
弹囚,也可以是完整的類(lèi)名厨相。Reflect.create:
用來(lái)調(diào)用on
類(lèi)的構(gòu)造方法,有兩種重載鸥鹉,一種有參數(shù)蛮穿,一種無(wú)參數(shù)。Reflect.call:
方法調(diào)用毁渗,傳入方法名和參數(shù)践磅,如有返回值還需要調(diào)用get
方法接收返回值。Reflect.get:
獲染囊臁(field
和method
返回)值相關(guān)府适,會(huì)進(jìn)行類(lèi)型轉(zhuǎn)換,常與call
和field
組合使用肺樟。Reflect.field:
獲取屬性值相關(guān)檐春,需要調(diào)用get
獲取該值。Reflect.set:
設(shè)置屬性相關(guān)儡嘶。ReflectException:
對(duì) Java 反射各種異常的包裝,屬于unchecked
異常恍风,語(yǔ)法上不需要顯式進(jìn)行捕獲蹦狂,但是也需要根據(jù)實(shí)際情況決定是否進(jìn)行顯式捕獲該異常。
本文轉(zhuǎn)載自 推薦一個(gè)簡(jiǎn)化反射操作代碼的優(yōu)雅寫(xiě)法