摘要:在思否上面開了一個專欄,主要是想對零散的知識點做一個梳理,在與大家交流的同時,也加強自己的理解。今天主要談一下中的反射機制,雖然實際編程中我們很少直接使用,但是反射機制卻始終圍繞著我們程序員。
在思否上面開了一個專欄,主要是想對零散的知識點做一個梳理,在與大家交流的同時,也加強自己的理解。
? 今天主要談一下Java中的反射機制,雖然實際編程中我們很少直接使用,但是反射機制卻始終圍繞著我們java程序員。我們知道由Java語言編寫的程序需要經過編譯和解釋兩個步驟,經過編譯生成一種與平臺無關的字節碼文件,即*.class文件。將 *.class文件讀入內存,并創建一個java.lang.Class對象的過程稱為類的加載,在這兒我們先不談類的加載機制,今天的重點是反射,之所以有上面的介紹,是因為反射就是通過該Class對象訪問整個類的一個過程。
獲取Class對象的三種方式:
使用Class類的forName(String clazzName)靜態方法
調用某個類的class屬性獲取該類的Class對象,eg:Student.class
調用某個對象的getClass()方法, eg:student.getClass()
獲取Class對應類所包含的構造方法
Constructor
Constructor
Constructor>[] getConstructors():返回對應類所有public構造方法
Constructor>[] getDeclaredConstructors():返回對應類的所有構造方法
獲取Class對應類所包含的普通方法
Method getMethod(String name,Class> ... parameterTypes):返回對應類的帶指定形參列表的public方法
Method[] getMethods():返回對應類的所有public方法
Method getDeclaredMethod(String name,Class> ... parameterTypes):返回對應類的帶指定形參列表的方法
Method[] getDeclaredMethods():返回對應類的全部方法
獲取Class對應類所包含的成員變量
Field getField(String name):返回對應類指定指定名稱的public成員變量
Filed[] getFields():返回對應類的所有public成員變量
Filed getDeclaredField(String name):返回對應類的指定名稱的成員變量
Filed[] getDeclaredFields():返回對應類的全部成員變量
?上面利用Class對象獲取對應類的構造方法、普通方法、成員變量都比較簡單,之所以放在這兒,是方便查看,所以不給出示例代碼。
?接下來,著重介紹兩個利用反射的典型例子:
?這兒有具體的實現過程,有興趣可以自己寫一遍,有助于更好的理解
?利用反射實現泛型的擦除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); } } }
?定義一個泛型為String的list集合,使用反射技術,可以實現泛型的擦除,加入int類型的值。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69715.html
摘要:結構型模式適配器模式橋接模式裝飾模式組合模式外觀模式享元模式代理模式。行為型模式模版方法模式命令模式迭代器模式觀察者模式中介者模式備忘錄模式解釋器模式模式狀態模式策略模式職責鏈模式責任鏈模式訪問者模式。 主要版本 更新時間 備注 v1.0 2015-08-01 首次發布 v1.1 2018-03-12 增加新技術知識、完善知識體系 v2.0 2019-02-19 結構...
摘要:可實現單例模式代碼塊初始化靜態變量,只被執行一次內部類不能與外部類重名,只能訪問外部類靜態數據包括私有多分支選擇整型或字符類型變量或整數表達式開始支持。 前言 大學期間接觸 Java 的時間也不短了,不論學習還是實習,都讓我發覺基礎的重要性。互聯網發展太快了,各種框架各種技術更新迭代的速度非常快,可能你剛好掌握了一門技術的應用,它卻已經走在淘汰的邊緣了。 而學習新技術總要付出一定的時間...
摘要:接口與類型信息關鍵字的一種重要目標就是允許程序員隔離構件,進而降低耦合性。如果你編寫接口,那么就可以實現這一目標,但是通過類型信息,這種耦合性還是會傳播出去接口并非是對解耦的一種無懈可擊的保障。 點擊進入我的博客 運行時類型信息使得你可以在運行時發現和使用類型信息,主要有兩種方式: 傳統的RTTI,它假定我們在編譯時已經知道了所有的類型; 反射機制,它允許我們在運行時發現和使用類的...
摘要:這種語法,在中被稱為動態代理。在動態代理機制中,這個角色只能是接口。動態代理就是實現的技術之一。 所謂動態代理,指的是語言提供的一種語法,能夠將對對象中不同方法的調用重定向到一個統一的處理函數中來。python重寫__getattr__函數能夠做到這一點,就連世界上最好的語言也提供稱為魔術方法的__call。這種語法除了能更好的實現動態代理外,還是RPC框架實現原理的一部分。 動態代理...
閱讀 675·2021-09-30 09:47
閱讀 2869·2021-09-04 16:40
閱讀 853·2019-08-30 13:18
閱讀 3447·2019-08-29 16:22
閱讀 1551·2019-08-29 12:36
閱讀 583·2019-08-29 11:11
閱讀 1474·2019-08-26 13:47
閱讀 1127·2019-08-26 13:32