標籤:
Java 反射的API
反射中常常用的幾個類如下所示:
java.lang 包中:
--Class 類:代表一個類
Java 中,無論產生某個類的多少個對象,這些對象都會對應同一個 Class 對象
Java.lang.reflect 包中:
--Field 類:代表類的成員變數(類的屬性)
--Method 類:代表類的方法,一個方法對應一個 Method 對象
--Constructor 類:代表類的構造方法
--Array 類:提供動態建立數組,以及訪問數組的元素的靜態方法
利用反射機制調用某個類中的某個方法的步驟:
1. 擷取該類的 Class 對象
常用方法有三種:
a) 通過 Class 的 forName 的靜態方法獲得(參數:包名 + 類名):
Class<?> classType = Class.forName("java.lang.String");
b) 通過類名 + 點 class 的方法獲得:
Class<?> c = String.class;
通過類的對象的 getClass 的方法獲得:
String str = "test";
Class<?> typeClass = str.getClass();
2. 執行個體化一個該類的對象
兩種方法:
a) 通過 Class 對象的 newInstance 的方法建立(該方法只對無參構造方法適用):
Class<?> classType = Class.forName("java.lang.String");
Object obj = = classType.newInstance();
b) 通過擷取 Constructor 構造方法類的對象,然後通過該對象的 newInstance (Object ... initargs) 方法獲得:
Class<?> classType = cus.getClass();
Constructor con
= classType.getConstructor(new Class[]{String.class,int.class});
Object object
= con.newInstance(new Object[]{cus.getName(),cus.getAge()});
該方法中的若寫成兩個參數寫成 Class[]{} 和 new Object[ ]{} ,就等同於 a) 的方法
3. 擷取目標方法的 Method 對象
Method method = classType.getMethod ( methodname,new Class[]{ 參數類型 .class} ) ;
4. 用 Method 對象調用目標方法:
Object result = method.invoke(object,new Object[]{});
// 其中 object 為擁有該方法的對象, object[]{} 為該方法的參數
5. 擷取類中的屬性值, get 取值, set 賦值
// 擷取屬性列表
Field fields[] = classType.getDeclaredFields();
Field field = classType.getDeclaredFields( 屬性名稱 );
// 擷取“屬性名稱”對應 Field 對象
field.set( 類的對象, value);
// 給屬性賦新值
例子:訪問被private 修飾的方法和屬性
採用反射機制,訪問下邊的類:
public class Private{ private String name = "張三"; private String getName() { return name; }}
把該類中private修飾的 name 值改成“李四”,並且用反射機制調用 getName 方法,返回修改後的值。
package com.wangzhuo.reflect;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;public class PrivateTest{ public static void main(String[] args)throws Exception { //擷取Private類的Class對象 Class<?> classType = Class.forName("com.wangzhuo.reflect.Private"); //擷取其構造方法對應的Constructor對象 Constructor con = classType.getDeclaredConstructor(new Class[]{}); //建立Private的對象 Object object =con.newInstance(new Object[]{}); //擷取Private類中name屬性對應的Field對象 Field field = classType.getDeclaredField("name"); //設定避開java存取控制檢測 field.setAccessible(true); //擷取修改前的值 Object str = field.get(object); System.out.println("修改之前name的值:"+(String)str); //給name屬性賦值 field.set(object, "李四"); //擷取getName方法對應的Method對象 Method getNameMethod = classType.getDeclaredMethod("getName", new Class[]{}); //設定避開java存取控制檢測 getNameMethod.setAccessible(true); //調用方法,傳回值 Object o = getNameMethod.invoke(object, new Object[]{}); System.out.println("修改之後name的值:"+(String)o); }}
java反射機制學習筆記及例子代碼