国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:87日期:2022-09-02 18:14:57

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

本文內容: 產生反射技術的需求 反射技術的使用 一個小示例

首發日期:2018-05-10

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

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

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

PS:

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

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

反射的使用: 反射技術是一種動態語言的技術,它可以動態的獲取類以及類中的成員,并可以調用該類成員。獲取外部字節碼文件中的類: 對于內部的類,獲取該類的對象時我們可以使用newJava反射技術原理與用法實例分析 但是如果字節碼文件中獲取類的話,需要Class類,如果通過Class類獲取了一個字節碼中的類,那么我們再可以直接new這個來獲取一個對象。 對于代碼中的類,可以使用 類對象.getClass()來獲取一個字節碼文件對象。Java反射技術原理與用法實例分析 對于代碼中的類,也可以使用 類.class 來獲取一個字節碼文件對象。Java反射技術原理與用法實例分析 對于外部代碼中的類,可以使用Class.forName('類字節碼文件路徑')來獲取一個字節碼文件對象【這個類字節碼文件是classpath中能夠識別的路徑,eclipse中會自動加上一部分classpath】【eclipse中,在每一個project的目錄下都有一個classpath來標明字節碼文件和源代碼文件的位置】【在eclipse中可以方便地使用包名.類名來獲取字節碼文件】Java反射技術原理與用法實例分析獲取外部類的對象(獲取構造方法): 獲取字節碼文件中的類對象后,可以使用newInstance()來生成一個對象。Java反射技術原理與用法實例分析 直接使用Class對象.newInstance()生成的對象默認是調用對應類的空參構造方法實例化生成的對象。 但沒有空參數的構造方法時: 1.首先需要獲取構造方法來生成指定的對象,可以使用getConstructors()來獲取所有構造函數,getConstructor(參數類型列表)來獲取符合參數列表的構造方法;【1.這里對于getConstructor注意參數類型列表不是數據類型+變量名,而是一個個Class:數據類型.class】Java反射技術原理與用法實例分析【2.Constructor是一個存放構造器的類?!俊?.獲取的構造方法應該是public的】 2.然后再利用構造器對象.newInstance(參數列表)來實例化對象。Java反射技術原理與用法實例分析 如果是非public的構造方法,可以使用getDeclaredConstructor(參數類型列表)來獲取構造方法。同樣的,getDeclaredConstructors()是獲取所有不論public還是非public的構造方法。 獲取外部對象的屬性: 首先通過Class對象獲取變量域field:Java反射技術原理與用法實例分析【Field類用來存儲變量域】 getField(變量名):獲取指定變量名的public的成員變量 getFields():獲取所有public的成員變量 getDeclaredField(變量名):獲取不論public還是非public的指定變量名的成員變量 getDeclaredFields():獲取不論public還是非public的所有成員變量 然后使用Field對象來操作: 賦值:Field對象.set(對象名,變量值)Java反射技術原理與用法實例分析 獲取值:Field對象.get(對象名)Java反射技術原理與用法實例分析 獲取外部對象的方法: 首先通過Class對象獲取方法域method:Java反射技術原理與用法實例分析【Field類用來存儲方法域】 getMethod(方法名, 參數類型列表):獲取public的指定名的方法 getMethods():獲取public的所有方法

getDeclaredMethod(方法名, 參數類型列表):獲取不論public還是非public的指定名的方法【用來獲取私有的方法】

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

然后使用Method對象操作:

非靜態方法調用:Method對象.invoke(對象名,對象名…)Java反射技術原理與用法實例分析

靜態方法調用:Method對象.invoke(null)Java反射技術原理與用法實例分析

補充: 如果想使用普通方法就能訪問私有的變量或屬性,可以使用:field.setAccesccible(true)一個小示例:1.讀取”軟件列表“:

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

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

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

3.開發'軟件”:

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

3.給軟件列表加上內容:Java反射技術原理與用法實例分析4.運行

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

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

標簽: Java
相關文章:
主站蜘蛛池模板: 三上悠亚免费一区二区在线 | 国产综合久久一区二区三区 | 日韩欧美一区二区在线观看 | 欧美日韩精品高清一区二区 | 久久精品国产精品亚洲 | 精品中文字幕在线观看 | 中文字幕一区二区三区 精品 | 国产三级在线观看a | 国产成人精品微拍视频 | 香蕉在线观看999 | 久在线| 波多野一区二区三区在线 | 亚洲一区毛片 | 亚洲精品视频在线观看视频 | 国产欧美日韩视频在线观看一区二区 | 久久精品国产第一区二区 | 台湾黄三级高清在线观看播放 | 美女张开腿让男人桶爽免 | 亚洲国产视频网 | 亚洲国产精久久久久久久春色 | 欧美精品久久 | 精品国产免费观看久久久 | 欧美日韩国产综合一区二区三区 | 美女扒开腿让男生桶爽网站 | a级片免费观看 | 成人三级在线播放线观看 | 国产高清一区二区三区免费视频 | 亚洲依依成人综合在线网址 | 欧美jizz19性欧美 | 国产三级全黄 | 亚洲精品日韩在线一区 | 91精选国产 | 免费亚洲黄色 | 毛片一区二区三区 | 国产成人免费片在线观看 | 欧美日韩国产58香蕉在线视频 | 欧美日韩精品一区二区三区高清视频 | 日本一级特黄高清ab片 | 国产亚洲精品日韩已满十八 | 成人免费视频网站 | 国产a一级毛片含羞草传媒 国产a自拍 |