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