摘要:在思否上面開了一個(gè)專欄,主要是想對(duì)零散的知識(shí)點(diǎn)做一個(gè)梳理,在與大家交流的同時(shí),也加強(qiáng)自己的理解。今天主要談一下中的反射機(jī)制,雖然實(shí)際編程中我們很少直接使用,但是反射機(jī)制卻始終圍繞著我們程序員。
在思否上面開了一個(gè)專欄,主要是想對(duì)零散的知識(shí)點(diǎn)做一個(gè)梳理,在與大家交流的同時(shí),也加強(qiáng)自己的理解。
? 今天主要談一下Java中的反射機(jī)制,雖然實(shí)際編程中我們很少直接使用,但是反射機(jī)制卻始終圍繞著我們java程序員。我們知道由Java語(yǔ)言編寫的程序需要經(jīng)過(guò)編譯和解釋兩個(gè)步驟,經(jīng)過(guò)編譯生成一種與平臺(tái)無(wú)關(guān)的字節(jié)碼文件,即*.class文件。將 *.class文件讀入內(nèi)存,并創(chuàng)建一個(gè)java.lang.Class對(duì)象的過(guò)程稱為類的加載,在這兒我們先不談?lì)惖募虞d機(jī)制,今天的重點(diǎn)是反射,之所以有上面的介紹,是因?yàn)?strong>反射就是通過(guò)該Class對(duì)象訪問(wèn)整個(gè)類的一個(gè)過(guò)程。
獲取Class對(duì)象的三種方式:
使用Class類的forName(String clazzName)靜態(tài)方法
調(diào)用某個(gè)類的class屬性獲取該類的Class對(duì)象,eg:Student.class
調(diào)用某個(gè)對(duì)象的getClass()方法, eg:student.getClass()
獲取Class對(duì)應(yīng)類所包含的構(gòu)造方法
Constructor
Constructor
Constructor>[] getConstructors():返回對(duì)應(yīng)類所有public構(gòu)造方法
Constructor>[] getDeclaredConstructors():返回對(duì)應(yīng)類的所有構(gòu)造方法
獲取Class對(duì)應(yīng)類所包含的普通方法
Method getMethod(String name,Class> ... parameterTypes):返回對(duì)應(yīng)類的帶指定形參列表的public方法
Method[] getMethods():返回對(duì)應(yīng)類的所有public方法
Method getDeclaredMethod(String name,Class> ... parameterTypes):返回對(duì)應(yīng)類的帶指定形參列表的方法
Method[] getDeclaredMethods():返回對(duì)應(yīng)類的全部方法
獲取Class對(duì)應(yīng)類所包含的成員變量
Field getField(String name):返回對(duì)應(yīng)類指定指定名稱的public成員變量
Filed[] getFields():返回對(duì)應(yīng)類的所有public成員變量
Filed getDeclaredField(String name):返回對(duì)應(yīng)類的指定名稱的成員變量
Filed[] getDeclaredFields():返回對(duì)應(yīng)類的全部成員變量
?上面利用Class對(duì)象獲取對(duì)應(yīng)類的構(gòu)造方法、普通方法、成員變量都比較簡(jiǎn)單,之所以放在這兒,是方便查看,所以不給出示例代碼。
?接下來(lái),著重介紹兩個(gè)利用反射的典型例子:
?這兒有具體的實(shí)現(xiàn)過(guò)程,有興趣可以自己寫一遍,有助于更好的理解
?利用反射實(shí)現(xiàn)泛型的擦除public class GenericErasure { public static void main(String[] args) throws Exception { Listlist = new ArrayList<>(); list.add("你好"); Class extends List> clazz = list.getClass(); Method method = clazz.getMethod("add",Object.class); method.invoke(list, 1); for (Object ele : list) { System.out.println(ele); } } }
?定義一個(gè)泛型為String的list集合,使用反射技術(shù),可以實(shí)現(xiàn)泛型的擦除,加入int類型的值。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69715.html
摘要:結(jié)構(gòu)型模式適配器模式橋接模式裝飾模式組合模式外觀模式享元模式代理模式。行為型模式模版方法模式命令模式迭代器模式觀察者模式中介者模式備忘錄模式解釋器模式模式狀態(tài)模式策略模式職責(zé)鏈模式責(zé)任鏈模式訪問(wèn)者模式。 主要版本 更新時(shí)間 備注 v1.0 2015-08-01 首次發(fā)布 v1.1 2018-03-12 增加新技術(shù)知識(shí)、完善知識(shí)體系 v2.0 2019-02-19 結(jié)構(gòu)...
摘要:可實(shí)現(xiàn)單例模式代碼塊初始化靜態(tài)變量,只被執(zhí)行一次內(nèi)部類不能與外部類重名,只能訪問(wèn)外部類靜態(tài)數(shù)據(jù)包括私有多分支選擇整型或字符類型變量或整數(shù)表達(dá)式開始支持。 前言 大學(xué)期間接觸 Java 的時(shí)間也不短了,不論學(xué)習(xí)還是實(shí)習(xí),都讓我發(fā)覺(jué)基礎(chǔ)的重要性?;ヂ?lián)網(wǎng)發(fā)展太快了,各種框架各種技術(shù)更新迭代的速度非??欤赡苣銊偤谜莆樟艘婚T技術(shù)的應(yīng)用,它卻已經(jīng)走在淘汰的邊緣了。 而學(xué)習(xí)新技術(shù)總要付出一定的時(shí)間...
摘要:接口與類型信息關(guān)鍵字的一種重要目標(biāo)就是允許程序員隔離構(gòu)件,進(jìn)而降低耦合性。如果你編寫接口,那么就可以實(shí)現(xiàn)這一目標(biāo),但是通過(guò)類型信息,這種耦合性還是會(huì)傳播出去接口并非是對(duì)解耦的一種無(wú)懈可擊的保障。 點(diǎn)擊進(jìn)入我的博客 運(yùn)行時(shí)類型信息使得你可以在運(yùn)行時(shí)發(fā)現(xiàn)和使用類型信息,主要有兩種方式: 傳統(tǒng)的RTTI,它假定我們?cè)诰幾g時(shí)已經(jīng)知道了所有的類型; 反射機(jī)制,它允許我們?cè)谶\(yùn)行時(shí)發(fā)現(xiàn)和使用類的...
摘要:這種語(yǔ)法,在中被稱為動(dòng)態(tài)代理。在動(dòng)態(tài)代理機(jī)制中,這個(gè)角色只能是接口。動(dòng)態(tài)代理就是實(shí)現(xiàn)的技術(shù)之一。 所謂動(dòng)態(tài)代理,指的是語(yǔ)言提供的一種語(yǔ)法,能夠?qū)?duì)對(duì)象中不同方法的調(diào)用重定向到一個(gè)統(tǒng)一的處理函數(shù)中來(lái)。python重寫__getattr__函數(shù)能夠做到這一點(diǎn),就連世界上最好的語(yǔ)言也提供稱為魔術(shù)方法的__call。這種語(yǔ)法除了能更好的實(shí)現(xiàn)動(dòng)態(tài)代理外,還是RPC框架實(shí)現(xiàn)原理的一部分。 動(dòng)態(tài)代理...
閱讀 687·2021-09-30 09:47
閱讀 2876·2021-09-04 16:40
閱讀 864·2019-08-30 13:18
閱讀 3457·2019-08-29 16:22
閱讀 1563·2019-08-29 12:36
閱讀 593·2019-08-29 11:11
閱讀 1482·2019-08-26 13:47
閱讀 1134·2019-08-26 13:32