成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Java反射的封裝

raledong / 3156人閱讀

摘要:每次看到很多人使用原生的反射接口,我心里都在想,愚蠢的人類啊,為什么不封裝一下再用。幸運(yùn)的是類的封裝已經(jīng)幫你實(shí)現(xiàn)了。

Java這種以啰嗦著稱的編程語(yǔ)言,反射代碼也很啰嗦。每次看到很多人使用原生的反射接口,我心里都在想,愚蠢的人類啊,為什么不封裝一下再用。

能用到反射的場(chǎng)景

不能靜態(tài)決定,比如根據(jù)URL參數(shù)的字符串調(diào)用相應(yīng)方法的時(shí)候。

避免樣板代碼的時(shí)候,例如可以用反射代替,繁瑣的JSON對(duì)象解析代碼。

避免顯式依賴的時(shí)候,有時(shí)候能用來(lái)打破項(xiàng)目之間的循環(huán)依賴關(guān)系。但要慎用,如果之間接口比較復(fù)雜,還是建議多帶帶使用協(xié)議接口的方法。

訪問(wèn)私有成員,做一些黑科技的事情的時(shí)候。

方法調(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.

這里是我簡(jiǎn)單的反射封裝代碼,不是很完整,只是解決了目前自己的需求。源碼也就100行,自己看吧。

有Declared和無(wú)Declared的區(qū)別

在Class類接口中,getDeclaredMethod getDeclaredField和getMethod getField的區(qū)別。
帶Declared的包含本類的私有和公開(kāi)成員,不包含繼承的成員。不帶Declare不含繼承的和自身的公開(kāi)成員,不包含私有成員。
如果要訪問(wèn)全體的成員,包括所有繼承的和私有的,那么代碼只會(huì)更加復(fù)雜。幸運(yùn)的是Reflection類的封裝已經(jīng)幫你實(shí)現(xiàn)了。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/65964.html

相關(guān)文章

  • 封裝BeanMap以及java反射和內(nèi)省

    摘要:所以,我實(shí)現(xiàn)了一個(gè)稱為的類來(lái)應(yīng)用反射?,F(xiàn)在流行的語(yǔ)言大都支持反射。這組內(nèi)省主要是針對(duì)類進(jìn)行操作的,能夠獲取類的屬性信息??梢钥吹?,通過(guò)的內(nèi)省機(jī)制,解決了的最關(guān)鍵的問(wèn)題。在封裝反射的時(shí)候,會(huì)充分考慮到各種情況。 BeanMap 學(xué)習(xí)具體的技術(shù)工具的好辦法就是些Demo、造輪子。所以,我實(shí)現(xiàn)了一個(gè)稱為BeanMap的類來(lái)應(yīng)用java反射API。 這個(gè)BeanMap的功能是將一個(gè)Bean包裝...

    張巨偉 評(píng)論0 收藏0
  • Java反射Java 泛型基礎(chǔ)

    摘要:筆記來(lái)源反射綜述類的使用方法的反射成員變量的反射構(gòu)造函數(shù)的反射類加載機(jī)制類的使用在面向?qū)ο蟮氖澜缋?,萬(wàn)事萬(wàn)物皆對(duì)象。 筆記來(lái)源:IMOOC 反射 Java Reflect 綜述 Class類的使用 方法的反射 成員變量的反射 構(gòu)造函數(shù)的反射 類加載機(jī)制 Class 類的使用 在面向?qū)ο蟮氖澜缋?,萬(wàn)事萬(wàn)物皆對(duì)象。 但在Java里面有兩樣?xùn)|西不是對(duì)象:靜態(tài)的成員、普通數(shù)據(jù)類型類...

    seanHai 評(píng)論0 收藏0
  • Java9模塊化學(xué)習(xí)筆記二之模塊設(shè)計(jì)模式

    摘要:但是模塊化當(dāng)中,無(wú)法掃描只有模塊中可以使用有兩種解決方案定義一個(gè)專門的資源模塊,并使用提供的接口,實(shí)現(xiàn)它,并將這個(gè)實(shí)現(xiàn)注冊(cè)為服務(wù)。有兩種方式使用或包名,包名模塊名使用運(yùn)行時(shí)動(dòng)態(tài)。 模塊設(shè)計(jì)的原則: 1、防止出現(xiàn)編譯時(shí)循環(huán)依賴(主要是編譯器不支持),但運(yùn)行時(shí)是允許循環(huán)依賴的,比如GUI應(yīng)用2、明確模塊的邊界 幾種模塊設(shè)計(jì): API模塊,聚合模塊(比如java.base) 可選依賴 兩種方...

    李文鵬 評(píng)論0 收藏0
  • 在運(yùn)行期通過(guò)反射了解JVM內(nèi)部機(jī)制

    摘要:我們找到了許多有趣的工具和組件用來(lái)檢測(cè)狀態(tài)的各個(gè)方面,其中一個(gè)就是在運(yùn)行期通過(guò)反射了解內(nèi)部機(jī)制。由于包含多種的實(shí)現(xiàn),就是供具體實(shí)現(xiàn)比如必須繼承的抽象類。調(diào)試器框架是可擴(kuò)展的,這意味著可以通過(guò)繼承這個(gè)抽象類來(lái)使用另一個(gè)調(diào)試器。 在日常工作中,我們都習(xí)慣直接使用或者通過(guò)框架使用反射。在沒(méi)有反射相關(guān)硬編碼知識(shí)的情況下,這是Java和Scala編程中使用的類庫(kù)與我們的代碼之間進(jìn)行交互的一種主要...

    crossea 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

raledong

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<