最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java反射技術(shù)原理與用法實(shí)例分析

 更新時(shí)間:2020年04月15日 10:24:10   作者:隨風(fēng)行云  
這篇文章主要介紹了Java反射技術(shù)原理與用法,結(jié)合實(shí)例形式分析了Java反射技術(shù)的基本概念、功能、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了Java反射技術(shù)原理與用法。分享給大家供大家參考,具體如下:

本文內(nèi)容:

  • 產(chǎn)生反射技術(shù)的需求
  • 反射技術(shù)的使用
  • 一個(gè)小示例

首發(fā)日期:2018-05-10


產(chǎn)生反射技術(shù)的需求:

  • 項(xiàng)目完成以后,發(fā)現(xiàn)需要增加功能,并且希望增加功能并不需要停止項(xiàng)目運(yùn)行。
  • 在希望不關(guān)停項(xiàng)目運(yùn)行的情況下,于是考慮到將功能都放到一個(gè)單獨(dú)的項(xiàng)目之外的模塊中,每一個(gè)功能實(shí)現(xiàn)都從這個(gè)模塊中獲取【實(shí)際上這個(gè)考慮應(yīng)該是項(xiàng)目開始前就考慮,這個(gè)例子可能不是很好】。于是就有了反射的產(chǎn)生。(這種思想有點(diǎn)類似工廠模式,如果學(xué)過設(shè)計(jì)模式的話就明白為什么要做的”開放“)

一個(gè)幫助理解例子:

一個(gè)網(wǎng)站有計(jì)算器功能,剛開始他們只有加減乘除的計(jì)算,后來他們決定增加上求乘方、求根號(hào)的計(jì)算,他們通過“關(guān)停網(wǎng)站后修改源代碼“來增加上他們需要的功能。第二次,他們加上xx功能,他們還是關(guān)停網(wǎng)站加功能。。。。后來他們發(fā)現(xiàn)應(yīng)該把這個(gè)”功能模塊“獨(dú)立出來,任何功能實(shí)現(xiàn)都通過讀取這個(gè)文件來實(shí)現(xiàn),比如想要實(shí)現(xiàn)乘方功能就需要查看這個(gè)模塊中是否定義了乘方功能。另外,將它獨(dú)立出來后,它一個(gè)模塊并不影響整個(gè)板塊的功能。

【上面的例子中,其他板塊如果想要知道獨(dú)立的模塊的內(nèi)容(屬性、方法),那么就要利用到反射技術(shù),反射技術(shù)可以使程序在運(yùn)行時(shí)解析外部對(duì)象的信息。】

PS:

  • 上面的例子有點(diǎn)像某系統(tǒng)從數(shù)據(jù)庫中讀取資料,把資料固定到代碼中顯然是一個(gè)很不明智的行為,把數(shù)據(jù)存到數(shù)據(jù)庫中,再利用SQL語句(類比反射技術(shù))從數(shù)據(jù)庫中讀取數(shù)據(jù)就降低了代碼之間的耦合。
  • 如果你希望將這個(gè)模塊有一個(gè)名詞解釋的話,可以把它稱為”配置文件“,有什么功能都可以讀取配置文件來獲取。下面就是講怎么從外部的”配置文件“中讀取具有什么屬性和功能了。

如果你已經(jīng)了解了 為什么需要反射,那么你可以繼續(xù)向下了,如果不了解,那么你可能需要了解更多再深入。


反射的使用:

  • 反射技術(shù)是一種動(dòng)態(tài)語言的技術(shù),它可以動(dòng)態(tài)的獲取類以及類中的成員,并可以調(diào)用該類成員。

獲取外部字節(jié)碼文件中的類:

  • 對(duì)于內(nèi)部的類,獲取該類的對(duì)象時(shí)我們可以使用newimage
  • 但是如果字節(jié)碼文件中獲取類的話,需要Class類,如果通過Class類獲取了一個(gè)字節(jié)碼中的類,那么我們?cè)倏梢灾苯觧ew這個(gè)來獲取一個(gè)對(duì)象。
    • 對(duì)于代碼中的類,可以使用 類對(duì)象.getClass()來獲取一個(gè)字節(jié)碼文件對(duì)象。image
    • 對(duì)于代碼中的類,也可以使用 類.class 來獲取一個(gè)字節(jié)碼文件對(duì)象。image
    • 對(duì)于外部代碼中的類,可以使用Class.forName("類字節(jié)碼文件路徑")來獲取一個(gè)字節(jié)碼文件對(duì)象【這個(gè)類字節(jié)碼文件是classpath中能夠識(shí)別的路徑,eclipse中會(huì)自動(dòng)加上一部分classpath】【eclipse中,在每一個(gè)project的目錄下都有一個(gè)classpath來標(biāo)明字節(jié)碼文件和源代碼文件的位置】【在eclipse中可以方便地使用包名.類名來獲取字節(jié)碼文件image

獲取外部類的對(duì)象(獲取構(gòu)造方法):

  • 獲取字節(jié)碼文件中的類對(duì)象后,可以使用newInstance()來生成一個(gè)對(duì)象。image
  • 直接使用Class對(duì)象.newInstance()生成的對(duì)象默認(rèn)是調(diào)用對(duì)應(yīng)類的空參構(gòu)造方法實(shí)例化生成的對(duì)象。
  • 但沒有空參數(shù)的構(gòu)造方法時(shí):
    • 1.首先需要獲取構(gòu)造方法來生成指定的對(duì)象,可以使用getConstructors()來獲取所有構(gòu)造函數(shù),getConstructor(參數(shù)類型列表)來獲取符合參數(shù)列表的構(gòu)造方法;【1.這里對(duì)于getConstructor注意參數(shù)類型列表不是數(shù)據(jù)類型+變量名,而是一個(gè)個(gè)Class:數(shù)據(jù)類型.class】image【2.Constructor是一個(gè)存放構(gòu)造器的類?!俊?.獲取的構(gòu)造方法應(yīng)該是public的】
    • 2.然后再利用構(gòu)造器對(duì)象.newInstance(參數(shù)列表)來實(shí)例化對(duì)象。image
    • 如果是非public的構(gòu)造方法,可以使用getDeclaredConstructor(參數(shù)類型列表)來獲取構(gòu)造方法。同樣的,getDeclaredConstructors()是獲取所有不論public還是非public的構(gòu)造方法。

獲取外部對(duì)象的屬性:

  • 首先通過Class對(duì)象獲取變量域field:image【Field類用來存儲(chǔ)變量域】
    • getField(變量名):獲取指定變量名的public的成員變量
    • getFields():獲取所有public的成員變量
    • getDeclaredField(變量名):獲取不論public還是非public的指定變量名的成員變量
    • getDeclaredFields():獲取不論public還是非public的所有成員變量
  • 然后使用Field對(duì)象來操作:
    • 賦值:Field對(duì)象.set(對(duì)象名,變量值)image
    • 獲取值:Field對(duì)象.get(對(duì)象名)image

獲取外部對(duì)象的方法:

  • 首先通過Class對(duì)象獲取方法域method:image【Field類用來存儲(chǔ)方法域】
    • getMethod(方法名, 參數(shù)類型列表):獲取public的指定名的方法
    • getMethods():獲取public的所有方法
    • getDeclaredMethod(方法名, 參數(shù)類型列表):獲取不論public還是非public的指定名的方法【用來獲取私有的方法】

    • getDeclaredMethods():獲取不論public還是非public的方法

  • 然后使用Method對(duì)象操作:

    • 非靜態(tài)方法調(diào)用:Method對(duì)象.invoke(對(duì)象名,對(duì)象名…)image

    • 靜態(tài)方法調(diào)用:Method對(duì)象.invoke(null)image

補(bǔ)充:

  • 如果想使用普通方法就能訪問私有的變量或?qū)傩?,可以使?field.setAccesccible(true)


一個(gè)小示例:

1.讀取”軟件列表“:

image

2.通過讀取功能列表來獲知類的字節(jié)碼的路徑

image

3.開發(fā)"軟件”:

image

3.給軟件列表加上內(nèi)容:image

4.運(yùn)行

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計(jì)入門與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Java并發(fā)系列之Semaphore源碼分析

    Java并發(fā)系列之Semaphore源碼分析

    這篇文章主要為大家詳細(xì)介紹了Java并發(fā)系列之Semaphore源碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Springboot整合Gson報(bào)錯(cuò)問題解決過程

    Springboot整合Gson報(bào)錯(cuò)問題解決過程

    這篇文章主要介紹了Springboot整合Gson報(bào)錯(cuò)問題解決過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 使用mybatis-plus-generator進(jìn)行代碼自動(dòng)生成的方法

    使用mybatis-plus-generator進(jìn)行代碼自動(dòng)生成的方法

    這篇文章主要介紹了使用mybatis-plus-generator進(jìn)行代碼自動(dòng)生成的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Python如何使用@property @x.setter及@x.deleter

    Python如何使用@property @x.setter及@x.deleter

    這篇文章主要介紹了Python如何使用@property @x.setter及@x.deleter,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • SpringBoot中讀取jar包中的resources目錄下的文件的三種方式

    SpringBoot中讀取jar包中的resources目錄下的文件的三種方式

    這篇文章給大家總結(jié)了SpringBoot讀取 jar 包中的 resources 目錄下的文件的三種方式,文中有詳細(xì)的代碼示例供大家參考,,需要的朋友可以參考下
    2023-06-06
  • java關(guān)于字符串的常用API

    java關(guān)于字符串的常用API

    字符串其實(shí)就是一串連續(xù)的字符,它是由許多單個(gè)字符連接而成的。如多個(gè)英文字母所組成的一個(gè)英文單詞。字符串中可以包含任意字符,這些字符必須包含在一對(duì)雙引號(hào)之內(nèi),今天就來介紹字符串常用的API
    2023-05-05
  • Java中的運(yùn)算符你知道多少

    Java中的運(yùn)算符你知道多少

    這篇文章主要為大家詳細(xì)介紹了Java中的運(yùn)算符,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 如何把spring boot項(xiàng)目部署到tomcat容器中

    如何把spring boot項(xiàng)目部署到tomcat容器中

    本文給大家分享如何把spring boot項(xiàng)目部署到tomcat容器中,本文給大家介紹的非常詳細(xì),需要的朋友參考下
    2017-04-04
  • java使用Logback配置輸出日志內(nèi)容到文件示例代碼

    java使用Logback配置輸出日志內(nèi)容到文件示例代碼

    這篇文章主要介紹了java?Logback輸出日志內(nèi)容到文件,要將logger.info的信息輸出到文件,您可以使用Logback配置,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • Java中的List集合初始化及常見方法解析

    Java中的List集合初始化及常見方法解析

    這篇文章主要介紹了Java中的List集合初始化及常見方法解析,List集合的特點(diǎn)是元素有序可重復(fù),只要是帶集合、數(shù)組的都叫有序,因若無序就不會(huì)存在有下標(biāo),本文來講一下List集合初始化及常見方法,需要的朋友可以參考下
    2023-10-10

最新評(píng)論

建平县| 黄骅市| 靖远县| 云龙县| 巴彦淖尔市| 班玛县| 张家口市| 搜索| 辽阳县| 滦平县| 浠水县| 泰州市| 曲阳县| 荔浦县| 和顺县| 晴隆县| 周宁县| 舟曲县| 漠河县| 邛崃市| 三门峡市| 石狮市| 庆阳市| 广宁县| 涿州市| 德兴市| 新化县| 高台县| 呼伦贝尔市| 饶阳县| 吉林省| 浙江省| 阿鲁科尔沁旗| 桐柏县| 抚州市| 杭州市| 英德市| 章丘市| 梨树县| 明星| 麻栗坡县|