傳智播客學習之java 反射
更新時間:2009年11月22日 23:55:41 作者:
昨天是預熱班學習的最后一天,為了檢驗我們是否能夠升入就業(yè)班學習,進行了預熱班結(jié)課考試。
此外,畢老師為我們講解了反射機制,雖然以后我們在開發(fā)過程中,不一定會涉及反射,但是反射確實java一種強大的工具,它使我們能夠創(chuàng)建靈活的代碼,這些代碼可以在運行時裝配,無需在組件之間進行源代表鏈接。例如在Tomcat類加載器這種機制被很多框架所使用。
一、什么是反射
反射的概念是由Smith在1982年首次提出,主要是指程序可以訪問、檢測和修改本身狀態(tài)行為的一種能力。反射是java程序開發(fā)語言的特征之一,它也允許運行中的 Java 程序?qū)ψ陨磉M行檢查,或者說“自審”,并能直接操作程序的內(nèi)部屬性。
二、java反射所需要的類
1.Class類:它的實例表示正在運行的java應用程序中的類和接口
2.Constructor類:提供關(guān)于類的單個構(gòu)造方法的信息以及對他的訪問權(quán)限。
3.Method類:提供有關(guān)類或接口的單獨的某個方法的信息
4.Array類:提供動態(tài)創(chuàng)建數(shù)組或訪問數(shù)組的靜態(tài)方法。
5.Field類:提供有關(guān)類或接口的屬性的信息,以及對他的動態(tài)訪問權(quán)限。
三、反射的功能
上面我們列舉了相關(guān)的類,那么具體利用這些類我們可以做一些什么事情呢?
1)獲取指定類的Class對象
方法一、通過對象.getClass.(例:Person p;Class c=p.getClass();)
方法二、通過Class類的forName方法(例:Class c=Class.forName(類名);)
方法三、通過類型名.class獲取(Class c = int.class)
2)在運行時構(gòu)造任意一個類的對象,步驟如下:
① 根據(jù)類名來創(chuàng)建出它的對象
② 返回這個新創(chuàng)建的對象
l 使用無參構(gòu)造方法,只需要用class對象的newInstance方法。
Class c=Class.forName(類名);Person p =(Person)c.newInstance;
l 使用有參的構(gòu)造方法,步驟如下:
① 獲取指定類的對象(同上)
② 通過Class對象獲取滿足指定參數(shù)的要求的構(gòu)造方法類對象
Constructor cons = c.getConstructor(String.class)
③ 調(diào)用指定Constructor對象的newInstance方法,傳入對用的參數(shù)值,創(chuàng)建出對象。
Person p =(Person)cons.newInstance(“張三”);
3)在運行時調(diào)用任意一個對象的方法,通過反射甚至可以調(diào)用到private方法
① 獲取指定類的對象(同上)
② 根據(jù)要求創(chuàng)建一個實例
③ 通過Class對象的getDeclaredMethods(根據(jù)需要可以選取不同方法)獲得Method 的實例,通過invoke方法調(diào)用方法
Method m=c.getDeclaredMethods(“setName”,String.class);
returnvalue = m.invoke(p,"zhangsan");
注意:如果是private方法,可以先調(diào)用這個方法對應的Method對象的setAccessible(true) 來取消對本方法的安全檢查
4)在運行時調(diào)用任意一個對象的屬性
① 獲取指定類的對象(同上)
② 根據(jù)要求創(chuàng)建一個實例
③ 通過Class對象的getDeclaredField(根據(jù)需要可以選取不同方法)獲得Field類 的實例,通過Set方法修改制定對象的值,get獲得對象的值。
Field f =c.getDeclaredField("name");
f.set(p,"張三");System.out.println(f.get(p));
一、什么是反射
反射的概念是由Smith在1982年首次提出,主要是指程序可以訪問、檢測和修改本身狀態(tài)行為的一種能力。反射是java程序開發(fā)語言的特征之一,它也允許運行中的 Java 程序?qū)ψ陨磉M行檢查,或者說“自審”,并能直接操作程序的內(nèi)部屬性。
二、java反射所需要的類
1.Class類:它的實例表示正在運行的java應用程序中的類和接口
2.Constructor類:提供關(guān)于類的單個構(gòu)造方法的信息以及對他的訪問權(quán)限。
3.Method類:提供有關(guān)類或接口的單獨的某個方法的信息
4.Array類:提供動態(tài)創(chuàng)建數(shù)組或訪問數(shù)組的靜態(tài)方法。
5.Field類:提供有關(guān)類或接口的屬性的信息,以及對他的動態(tài)訪問權(quán)限。
三、反射的功能
上面我們列舉了相關(guān)的類,那么具體利用這些類我們可以做一些什么事情呢?
1)獲取指定類的Class對象
方法一、通過對象.getClass.(例:Person p;Class c=p.getClass();)
方法二、通過Class類的forName方法(例:Class c=Class.forName(類名);)
方法三、通過類型名.class獲取(Class c = int.class)
2)在運行時構(gòu)造任意一個類的對象,步驟如下:
① 根據(jù)類名來創(chuàng)建出它的對象
② 返回這個新創(chuàng)建的對象
l 使用無參構(gòu)造方法,只需要用class對象的newInstance方法。
Class c=Class.forName(類名);Person p =(Person)c.newInstance;
l 使用有參的構(gòu)造方法,步驟如下:
① 獲取指定類的對象(同上)
② 通過Class對象獲取滿足指定參數(shù)的要求的構(gòu)造方法類對象
Constructor cons = c.getConstructor(String.class)
③ 調(diào)用指定Constructor對象的newInstance方法,傳入對用的參數(shù)值,創(chuàng)建出對象。
Person p =(Person)cons.newInstance(“張三”);
3)在運行時調(diào)用任意一個對象的方法,通過反射甚至可以調(diào)用到private方法
① 獲取指定類的對象(同上)
② 根據(jù)要求創(chuàng)建一個實例
③ 通過Class對象的getDeclaredMethods(根據(jù)需要可以選取不同方法)獲得Method 的實例,通過invoke方法調(diào)用方法
Method m=c.getDeclaredMethods(“setName”,String.class);
returnvalue = m.invoke(p,"zhangsan");
注意:如果是private方法,可以先調(diào)用這個方法對應的Method對象的setAccessible(true) 來取消對本方法的安全檢查
4)在運行時調(diào)用任意一個對象的屬性
① 獲取指定類的對象(同上)
② 根據(jù)要求創(chuàng)建一個實例
③ 通過Class對象的getDeclaredField(根據(jù)需要可以選取不同方法)獲得Field類 的實例,通過Set方法修改制定對象的值,get獲得對象的值。
Field f =c.getDeclaredField("name");
f.set(p,"張三");System.out.println(f.get(p));
您可能感興趣的文章:
- java類加載器和類反射使用示例
- java反射機制實戰(zhàn)示例分享
- java反射使用示例分享
- java根據(jù)方法名稱取得反射方法的參數(shù)類型示例
- java反射機制示例詳解
- java使用dom4j解析xml配置文件實現(xiàn)抽象工廠反射示例
- java反射實現(xiàn)javabean轉(zhuǎn)json實例代碼
- Java反射機制的學習總結(jié)
- Java 采用反射獲取class屬性值的實現(xiàn)代碼
- 基于Java回顧之反射的使用分析
- Java反射機制的實現(xiàn)詳解
- 基于java中反射的總結(jié)分析
- Java 反射獲取類詳細信息的常用方法總結(jié)
- AJAX JavaScript反射機制的介紹
- Java反射學習 getClass()函數(shù)應用
- Java 反射之私有字段和方法詳細介紹
- java反射應用詳細介紹
- java反射android的r文件的示例
相關(guān)文章
關(guān)于javascript函數(shù)的幾個話題
關(guān)于javascript函數(shù)的幾個話題...2007-03-03快速解決select2在bootstrap模態(tài)框中下拉框隱藏的問題
今天小編就為大家分享一篇快速解決select2在bootstrap模態(tài)框中下拉框隱藏的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08use jscript with List Proxy Server Information
use jscript with List Proxy Server Information...2007-06-06javascript檢查表單數(shù)據(jù)是否改變的方法
需要檢查用戶是否修改了一個表單中的內(nèi)容,可以使用本文提供的方法,如果修改了表單的內(nèi)容則返回true,沒修改則返回false,有需求的朋友可以參考下2013-07-07