Java基础教程:反射基础
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                Java基础教程:反射基础
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.                        
                                Java基礎(chǔ)教程:反射基礎(chǔ)
引入反射
反射是什么
能夠動態(tài)分析類能力的程序稱為反射。
反射是一種很強(qiáng)大且復(fù)雜的機(jī)制。
Class類
在程序運(yùn)行期間,Java運(yùn)行時系統(tǒng)始終為所有對象維護(hù)一個被稱為運(yùn)行時的類型標(biāo)識。這個對象追蹤著每個對象所屬的類。虛擬機(jī)利用運(yùn)行時類的信息選擇相應(yīng)的方法執(zhí)行。
我們可以通過專門的Java類訪問這些信息。保存這些信息的類稱為Class。
根據(jù)對象獲得類信息:
MyClass myClass; ..... Class cl = myClass.getClass(); cl.getName(); //獲得類名補(bǔ)充:獲得Class類的另外兩種方式:
1.調(diào)用靜態(tài)方法forName獲得類名相應(yīng)的Class對象。
String className = 'java.util.Date'; Class cl = Class.forName(className);2.直接獲取
?
Class cl1 =Date.class; Class cl2 = Integer.class;?
注意:
虛擬機(jī)為每一個類型管理一個Class對象。因此使用==可以實(shí)現(xiàn)兩個類對象比較的操作。
利用反射分析類的能力?
API函數(shù)舉例
- getDeclaredFields():獲得此類對象所表示的類或接口所聲明的所有字段。
- getDeclaredMethods():獲得此類對象所表示的類或接口所聲明的所有方法,包括公共、保護(hù)、私有但不包括繼承。
- getDeclaredConstructors()?:返回?Constructor?對象的一個數(shù)組,這些對象反映此?Class?對象表示的類聲明的所有構(gòu)造方法。
- getName():獲得此class所表示實(shí)體的名稱。
在運(yùn)行時使用反射分析對象
API函數(shù)舉例
- setAccessible(boolean flag):為反射對象設(shè)置可訪問標(biāo)志。為true使得對象的私有屬性也可以被查詢和設(shè)置。
- getField():?返回一個?Field?對象,它反映此?Class?對象所表示的類或接口的指定公共成員字段。
- get(Object obj):返回對象中用Field對象表示的域值。
- set(Object obj,Object newValue):用一個新值設(shè)置Obj對象中的Field對象表示的域。
實(shí)例演示
利用反射調(diào)用任意方法
API函數(shù)說明
public Object invoke(Object?obj,Object...?args)throws IllegalAccessException,IllegalArgumentException,InvocationTargetException?- 對帶有指定參數(shù)的指定對象調(diào)用由此?Method?對象表示的底層方法。個別參數(shù)被自動解包,以便與基本形參相匹配,基本參數(shù)和引用參數(shù)都隨需服從方法調(diào)用轉(zhuǎn)換。
- 如果底層方法是靜態(tài)的,那么可以忽略指定的?obj?參數(shù)。該參數(shù)可以為 null。
- 如果底層方法所需的形參數(shù)為 0,則所提供的?args?數(shù)組長度可以為 0 或 null。
- 如果底層方法是實(shí)例方法,則使用動態(tài)方法查找來調(diào)用它,這一點(diǎn)記錄在 Java Language Specification, Second Edition 的第 15.12.4.4 節(jié)中;在發(fā)生基于目標(biāo)對象的運(yùn)行時類型的重寫時更應(yīng)該這樣做。
- 如果底層方法是靜態(tài)的,并且尚未初始化聲明此方法的類,則會將其初始化。
- 如果方法正常完成,則將該方法返回的值返回給調(diào)用者;如果該值為基本類型,則首先適當(dāng)?shù)貙⑵浒b在對象中。但是,如果該值的類型為一組基本類型,則數(shù)組元素不?被包裝在對象中;換句話說,將返回基本類型的數(shù)組。如果底層方法返回類型為 void,則該調(diào)用返回 null。
?
轉(zhuǎn)載于:https://www.cnblogs.com/MrSaver/p/8343828.html
總結(jié)
以上是生活随笔為你收集整理的Java基础教程:反射基础的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Django安装使用基础
- 下一篇: unix的sed 用法介绍
