摘要:每次看到很多人使用原生的反射接口,我心里都在想,愚蠢的人類啊,為什么不封裝一下再用。幸運的是類的封裝已經(jīng)幫你實現(xiàn)了。
Java這種以啰嗦著稱的編程語言,反射代碼也很啰嗦。每次看到很多人使用原生的反射接口,我心里都在想,愚蠢的人類啊,為什么不封裝一下再用。
能用到反射的場景不能靜態(tài)決定,比如根據(jù)URL參數(shù)的字符串調(diào)用相應(yīng)方法的時候。
避免樣板代碼的時候,例如可以用反射代替,繁瑣的JSON對象解析代碼。
避免顯式依賴的時候,有時候能用來打破項目之間的循環(huán)依賴關(guān)系。但要慎用,如果之間接口比較復(fù)雜,還是建議多帶帶使用協(xié)議接口的方法。
訪問私有成員,做一些黑科技的事情的時候。
方法調(diào)用封裝封裝前的反射調(diào)用方法:
try { Class> class = obj.getClass(); Method method = class.getDeclaredMethod("foo", new Class[] { String.class }); method.invoke(obj, new Object[] {"hi"}); } catch (Exceptione ex) { }
非反射直接調(diào)用:
obj.foo("hi");
封裝后的反射調(diào)用:
Reflection.callMethod(obj, "foo", "hi");字段賦值封裝
封裝前的反射調(diào)用方法:
try { Class> class = obj.getClass(); Field field = class.getDeclaredField("bar"); field.setAccessible(true); Object old = field.get(obj); field.set(obj, "hi"); return old; } catch (Exceptione ex) { }
非反射直接字段賦值:
obj.bar = "hi";
封裝后字段賦值:
Reflection.setField(obj, "bar", "hi");源碼
Talk is cheap, show me the code.
這里是我簡單的反射封裝代碼,不是很完整,只是解決了目前自己的需求。源碼也就100行,自己看吧。
有Declared和無Declared的區(qū)別在Class類接口中,getDeclaredMethod getDeclaredField和getMethod getField的區(qū)別。
帶Declared的包含本類的私有和公開成員,不包含繼承的成員。不帶Declare不含繼承的和自身的公開成員,不包含私有成員。
如果要訪問全體的成員,包括所有繼承的和私有的,那么代碼只會更加復(fù)雜。幸運的是Reflection類的封裝已經(jīng)幫你實現(xiàn)了。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/65964.html
摘要:所以,我實現(xiàn)了一個稱為的類來應(yīng)用反射。現(xiàn)在流行的語言大都支持反射。這組內(nèi)省主要是針對類進行操作的,能夠獲取類的屬性信息。可以看到,通過的內(nèi)省機制,解決了的最關(guān)鍵的問題。在封裝反射的時候,會充分考慮到各種情況。 BeanMap 學習具體的技術(shù)工具的好辦法就是些Demo、造輪子。所以,我實現(xiàn)了一個稱為BeanMap的類來應(yīng)用java反射API。 這個BeanMap的功能是將一個Bean包裝...
摘要:筆記來源反射綜述類的使用方法的反射成員變量的反射構(gòu)造函數(shù)的反射類加載機制類的使用在面向?qū)ο蟮氖澜缋?,萬事萬物皆對象。 筆記來源:IMOOC 反射 Java Reflect 綜述 Class類的使用 方法的反射 成員變量的反射 構(gòu)造函數(shù)的反射 類加載機制 Class 類的使用 在面向?qū)ο蟮氖澜缋?,萬事萬物皆對象。 但在Java里面有兩樣?xùn)|西不是對象:靜態(tài)的成員、普通數(shù)據(jù)類型類...
摘要:但是模塊化當中,無法掃描只有模塊中可以使用有兩種解決方案定義一個專門的資源模塊,并使用提供的接口,實現(xiàn)它,并將這個實現(xiàn)注冊為服務(wù)。有兩種方式使用或包名,包名模塊名使用運行時動態(tài)。 模塊設(shè)計的原則: 1、防止出現(xiàn)編譯時循環(huán)依賴(主要是編譯器不支持),但運行時是允許循環(huán)依賴的,比如GUI應(yīng)用2、明確模塊的邊界 幾種模塊設(shè)計: API模塊,聚合模塊(比如java.base) 可選依賴 兩種方...
摘要:我們找到了許多有趣的工具和組件用來檢測狀態(tài)的各個方面,其中一個就是在運行期通過反射了解內(nèi)部機制。由于包含多種的實現(xiàn),就是供具體實現(xiàn)比如必須繼承的抽象類。調(diào)試器框架是可擴展的,這意味著可以通過繼承這個抽象類來使用另一個調(diào)試器。 在日常工作中,我們都習慣直接使用或者通過框架使用反射。在沒有反射相關(guān)硬編碼知識的情況下,這是Java和Scala編程中使用的類庫與我們的代碼之間進行交互的一種主要...
閱讀 1639·2021-11-22 09:34
閱讀 1713·2019-08-29 16:36
閱讀 2698·2019-08-29 15:43
閱讀 3139·2019-08-29 13:57
閱讀 1321·2019-08-28 18:05
閱讀 1909·2019-08-26 18:26
閱讀 3274·2019-08-26 10:39
閱讀 3483·2019-08-23 18:40