欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java反射技術原理與用法實例分析

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

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

本文內容:

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

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


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

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

一個幫助理解例子:

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

【上面的例子中,其他板塊如果想要知道獨立的模塊的內容(屬性、方法),那么就要利用到反射技術,反射技術可以使程序在運行時解析外部對象的信息?!?/p>

PS:

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

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


反射的使用:

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

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

  • 對于內部的類,獲取該類的對象時我們可以使用newimage
  • 但是如果字節(jié)碼文件中獲取類的話,需要Class類,如果通過Class類獲取了一個字節(jié)碼中的類,那么我們再可以直接new這個來獲取一個對象。
    • 對于代碼中的類,可以使用 類對象.getClass()來獲取一個字節(jié)碼文件對象。image
    • 對于代碼中的類,也可以使用 類.class 來獲取一個字節(jié)碼文件對象。image
    • 對于外部代碼中的類,可以使用Class.forName("類字節(jié)碼文件路徑")來獲取一個字節(jié)碼文件對象【這個類字節(jié)碼文件是classpath中能夠識別的路徑,eclipse中會自動加上一部分classpath】【eclipse中,在每一個project的目錄下都有一個classpath來標明字節(jié)碼文件和源代碼文件的位置】【在eclipse中可以方便地使用包名.類名來獲取字節(jié)碼文件image

獲取外部類的對象(獲取構造方法):

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

獲取外部對象的屬性:

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

獲取外部對象的方法:

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

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

  • 然后使用Method對象操作:

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

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

補充:

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


一個小示例:

1.讀取”軟件列表“:

image

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

image

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

image

3.給軟件列表加上內容:image

4.運行

更多java相關內容感興趣的讀者可查看本站專題:《Java面向對象程序設計入門與進階教程》、《Java數(shù)據(jù)結構與算法教程》、《Java操作DOM節(jié)點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設計有所幫助。

相關文章

  • java中的數(shù)學計算函數(shù)的總結

    java中的數(shù)學計算函數(shù)的總結

    這篇文章主要介紹了java中的數(shù)學計算函數(shù)的總結的相關資料,需要的朋友可以參考下
    2017-07-07
  • JAVA實現(xiàn)社會統(tǒng)一信用代碼校驗的方法

    JAVA實現(xiàn)社會統(tǒng)一信用代碼校驗的方法

    這篇文章主要介紹了JAVA實現(xiàn)社會統(tǒng)一信用代碼校驗的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • IntelliJ?IDEA快速查詢maven依賴關系圖文教程

    IntelliJ?IDEA快速查詢maven依賴關系圖文教程

    Maven提供了來查看依賴關系,而IDE往往提供了更加便利的方式,比如Eclipse或者IDEA都有類似的功能,下面這篇文章主要給大家介紹了關于IntelliJ?IDEA快速查詢maven依賴關系的相關資料,需要的朋友可以參考下
    2023-11-11
  • SpringMVC HttpMessageConverter消息轉換器

    SpringMVC HttpMessageConverter消息轉換器

    ??HttpMessageConverter???,報文信息轉換器,將請求報文轉換為Java對象,或將Java對象轉換為響應報文。???HttpMessageConverter???提供了兩個注解和兩個類型:??@RequestBody,@ResponseBody???,??RequestEntity,ResponseEntity??
    2023-04-04
  • Java Lambda表達式的方法引用和構造器引用實例分析

    Java Lambda表達式的方法引用和構造器引用實例分析

    這篇文章主要介紹了Java Lambda表達式的方法引用和構造器引用,結合實例形式分析了Lambda表達式的方法引用和構造器引用相關原理、用法及操作注意事項,需要的朋友可以參考下
    2019-09-09
  • logback-spring.xml的配置及示例詳解(直接復制粘貼可用)

    logback-spring.xml的配置及示例詳解(直接復制粘貼可用)

    在使用logback作為日志框架時,可以創(chuàng)建一個名為logback-spring.xml的配置文件來自定義日志輸出的格式和方式,下面這篇文章主要給大家介紹了關于logback-spring.xml的配置及示例詳解的相關資料,文中的代碼直接復制粘貼可用,需要的朋友可以參考下
    2024-01-01
  • Spring詳細解讀事務管理

    Spring詳細解讀事務管理

    Spring事務的本質就是對數(shù)據(jù)庫事務的支持,沒有數(shù)據(jù)庫事務,Spring是無法提供事務功能的。Spring只提供統(tǒng)一的事務管理接口,具體實現(xiàn)都是由數(shù)據(jù)庫自己實現(xiàn)的,Spring會在事務開始時,根據(jù)當前設置的隔離級別,調整數(shù)據(jù)庫的隔離級別,由此保持一致
    2022-04-04
  • mybatis中返回多個map結果問題

    mybatis中返回多個map結果問題

    這篇文章主要介紹了mybatis中返回多個map結果問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • java 中死鎖問題的實例詳解

    java 中死鎖問題的實例詳解

    這篇文章主要介紹了java 中死鎖問題的實例詳解的相關資料,希望通過本文大家能夠理解掌握死鎖的問題,需要的朋友可以參考下
    2017-09-09
  • Java的四種引用方式

    Java的四種引用方式

    這篇文章主要介紹了Java的四種引用方式,Java的引用方式主要包括強引用、軟引用、弱引用、虛引用;下面文章便來詳細介紹這四種引用方式,需要的朋友可以參考一下
    2021-10-10

最新評論