Java中的反射機制通俗地說就是把Java類中的各種成分映射成相應的Java類。
對於Java程式而言,利用反射機制會導致程式效能的下降。
我們知道每個Java類都可以用一個Class類的對象來表示,一個類的組成部分:成員變數,方法,構造方法,包結構等等資訊也用一個個類來表示,就像汽車是一個類,汽車的組成部分:發動機、變速箱、底盤等也可以是一個個的類。表示Java類的Class類顯然要提供一系列的方法來獲得此類中的變數、方法、構造方法、修飾符、包結構等資訊,這些資訊也用相應的Java;類的執行個體對象來表示,它們是Field、Method、Constructor、Package等等。
要瞭解反射機制必須要熟悉Java API中的與反射相關的類。
#首先來看看Constructor類
Constructor代表某個類中的一個構造方法:
1. 得到某個類所有的構造方法:
例子:Constructor[] constructors = Class.forName("java.lang.String").getConstructors();
2.得到某一個構造方法:
例子:Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
3.建立執行個體對象:
通常方式:String str = new String(new StringBuffer("abc"));
反射方式:String str = (String)constructor.newInstance(new StringBuffer("abc");
4.與3相比較,Class類中也有非靜態方法newInstance()
例子:String str = (String)Class.forName("java.lang.String").newInstance();
該方法內部先得到預設的構造方法(Constructor對象,無參),然後用該構造方法建立執行個體對象。
該方法內部用了緩衝機制來儲存預設構造方法的執行個體對象(Constructor對象,無參)。
#然後是Field類
Field類代表某個類中的一個成員變數
getField(name)方法得到的Field執行個體對象是與其所屬類的具體對象無關的,僅表示所屬類的域。
#然後是Method類
Method類代表某個類中的一個成員方法
1.得到類中的某一個方法
例子:Method methodCharAt = String.class.getMethod("charAt", int.class);
2.調用方法
通常方式:System.out.println(str.charAt(1));
反射方式:System.out.println(methodCharAt.invoke(str, 1));
如果傳遞給Method對象的invoke方法的第一個參數為null,則表示該Method對象對應的是一個靜態方法。
3.jdk 1.4和jdk 1.5的invoke方法的區別
jdk 1.4:public Object invoke(Object obj, Object[] args)
jdk 1.5:public Object invoke(Object obj, Object... args)
jdk 1.5相容jdk 1.4的文法,所以2中的反射字碼頁可以改寫為jdk 1.4的形式:methodCharAt.invoke(str, new Object[]{1});