摘要:調用構造函數對該對象進行初始化。,并將該字節碼文件封裝成了對象。清單,獲取字節碼文件中的字段。
1、什么是反射技術?
動態獲取指定類以及類中的內容(成員),并運行其內容。
應用程序已經運行,無法在其中進行new對象的建立,就無法使用對象。這時可以根據配置文件的類全名去找對應的字節碼文件,并加載進內存,并創建該類對象實例。這就需要使用反射技術完成
2、獲取class對象的三種方式
獲取Class對象的方式一:
通過對象具備的getClass方法(源于Object類的方法)。有點不方便,需要用到該類,并創建該類的對象,再調用getClass方法完成。
Person p = new Person();//創建Peron對象 Class clazz = p.getClass();//通過object繼承來的方法(getClass)獲取Person對應的字節碼
文件對象
獲取Class對象的方式二:
每一個類型都具備一個class靜態屬性,通過該屬性即可獲取該類的字節碼文件對象。比第一種簡單了一些,僅用一個靜態屬性就搞定了。但是,還是有一點不方便,還必須要使用到該類。 Class clazz = Person.class;
獲取Class對象方式三:
* 去找找Class類中是否有提供獲取的方法呢? * 找到了,static Class forName(className); * 相對方便的多,不需要直接使用具體的類,只要知道該類的名字即可。 * 而名字完成可以作為參數進行傳遞 ,這樣就可以提高擴展性。 * 所以為了動態獲取一個類,第三種方式最為常用。 Class clazz = Class.forName("com.bean.Person");//必須類全名
創建Person對象的方式
以前:
1.先加載com.bean.Person類進內存。 2.將該類封裝成Class對象。 3.根據Class對象,用new操作符創建com.bean.Person對象。 4.調用構造函數對該對象進行初始化。 com.bean.Person p = new com.bean.Person();
通過方式三:(此外還可以使用構造,構造可以指定參數---如String.class)
String className = "com.bean.Person";
//1,根據名稱獲取其對應的字節碼文件對象
1,通過forName()根據指定的類名稱去查找對應的字節碼文件,并加載進內存。 2,并將該字節碼文件封裝成了Class對象。 3,直接通過newIntstance方法,完成該對象的創建。 4,newInstance方法調用就是該類中的空參數構造函數完成對象的初始化。 Class clazz = Class.forName(className);
//2,通過Class的方法完成該指定類的對象創建。
Object object = clazz.newInstance();//該方法用的是指定類中默認的空參數構造函數完成的初始化。
清單1,獲取字節碼文件中的字段。
Class clazz = Class.forName("cn.itcast.bean.Person"); //獲取該類中的指定字段。比如age Field field = clazz.getDeclaredField("age");//clazz.getField("age"); //為了對該字段進行操作,必須要先有指定類的對象。 Object obj = clazz.newInstance();//對私有訪問,必須取消對其的訪問控制檢查,使用AccessibleObject父類中的 setAccessible的方法 field.setAccessible(true);//暴力訪問。建議大家盡量不要訪問私有 field.set(obj, 789);//獲取該字段的值。 Object o = field.get(obj); System.out.println(o);
備注:
getDeclaredField:獲取所有屬性,包括私有。 getField:獲取公開屬性,包括從父類繼承過來的,不包括非公開方法。
清單2,獲取字節碼文件中的方法。
//根據名稱獲取其對應的字節碼文件對象
Class clazz = Class.forName("com.bean.Person");
//調用字節碼文件對象的方法getMethod獲取class對象所表示的類的公共成員方法(指定方法),參數為方法名和當前方法的參數,無需創建對象,它是靜態方法
Method method = clazz.getMethod("staticShow", null);
//調用class對象所表示的類的公共成員方法,需要指定對象和方法中的參數列表
method.invoke(null, null);
………………………………………………………………………………………………………
Class clazz = Class.forName("com.bean.Person"); //獲取指定方法。 Method method = clazz.getMethod("publicShow", null); //獲取指定的類對象。 Object obj = clazz.newInstance(); method.invoke(obj, null);//對哪個對象調用方法,是參數組
好處:大大的提高了程序的擴展性。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/68977.html
摘要:反射機制一結合官方通過編寫的反射教程,復習一下反射的知識。反射的概念反射是一種在運行時獲取以及修改應用行為的一種工具。因為反射需要動態的解析類的信息,相比于非反射使用的方式要慢。反射需要獲取一定的運行時權限,在特定的安全環境下不一定存在。 Java反射機制(一) 結合Oracle官方通過JDK8編寫的反射教程,復習一下反射的知識。結尾篇補一個小例子。 主要內容 這次博客的主要內容就是簡...
摘要:但是為了豐富引用的種類,以適應各種應用,中加入了中引用,但是除了強引用,其生命周期會有所不同,生存能力遞減。加載該類的已被回收。 GC面臨的問題有三個:哪些內存需要回收、什么時候回收和怎么回收 哪些內存需要回收,一般有兩種方法 引用計數 對每個對象都有個被引用的次數,單被引用的次數為0的時候,就表示對象需要被回收 引用計數的缺點是沒有辦法解決循環引用導致的內存泄露問題 ...
摘要:而面向搜索引擎,就是我們要及時的使用百度谷歌遇到問題無法解決,先別急著放棄,可以去網絡尋找答案,你的坑大部分別人都已經走過了,大部分都可以找到合適的解決方案。 showImg(https://segmentfault.com/img/remote/1460000019236352?w=866&h=456); 前言: ●眾多的語言,到底哪一門才是適合我的?●我們為什么要學習Java語言呢...
摘要:目錄如何用提高效率后端掘金經常有人說我應該學一門語言,比如之類,但是卻不知道如何入門。本文將通過我是如何開發公司年會抽獎系統的后端掘金需求出現年會將近,而年會抽獎環節必不可少,但是抽獎系統卻還沒有。 云盤一個個倒下怎么辦?無需編碼,手把手教你搭建至尊私享云盤 - 工具資源 - 掘金微盤掛了,360倒了,百度云盤也立了Flag。能讓我們在云端儲存分享文件的服務越來越少了。 買一堆移動硬盤...
閱讀 3045·2021-09-22 14:59
閱讀 1878·2021-09-22 10:02
閱讀 2115·2021-09-04 16:48
閱讀 2265·2019-08-30 15:53
閱讀 2971·2019-08-30 11:27
閱讀 3410·2019-08-29 18:35
閱讀 966·2019-08-29 17:07
閱讀 2676·2019-08-29 13:27