Java反射機制詳解 及 Method.invoke 解釋
阿新 • • 發佈:2019-01-30
Java反射機制
Java反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法;這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為:Java語言的反射機制。
Java反射機制主要提供以下幾個功能:在執行時判斷任意一個物件所屬的類;在執行時構造任意一個類的物件;在執行時判斷任意一個類所具有的成員變數和方法;在執行時呼叫任意一個物件的方法;生成動態代理
Method.invoke
Method getMethod(String name, Class<?>… parameterTypes)
–返回一個 Method 物件,它反映此 Class 物件所表示的類或介面的指定公共成員方法。
方法後面接收的就是Class類的物件,而如:String.class、int.class這些位元組碼才是Class類的物件
也可以此種方式:
//getMethod第一個引數是方法名,第二個引數是該方法的引數型別, //因為存在同方法名不同引數這種情況,所以只有同時指定方法名和引數型別才能唯一確定一個方法 Method method = XXX.getClass().getMethod(methodName,new Class[0]); //第一個引數是具體呼叫該方法的物件 //第二個引數是執行該方法的具體引數 如一個函式 int Test(int a, String str); 對應的getMethod方法: 1. getMethod("Test",int.class,String.class); 2. getMethod("Test",new Class[]{int.class,String.class}); 然後通過invoke來呼叫此方法: 函式原型:Object Java.lang.reflect.Method.invoke(Object receiver, Object... args) //Method類的invoke(Object obj,Object args[])方法接收的引數必須為物件, //如果引數為基本型別資料,必須轉換為相應的包裝型別的物件。invoke()方法的返回值總是物件, //如果實際被呼叫的方法的返回型別是基本型別資料,那麼invoke()方法會把它轉換為相應的包裝型別的物件,再將其返回 receiver:該方法所在類的一個物件 args: 傳入的引數 如 100,“hello”
import java.lang.reflect.Method; public class InvokeTester { public int add(int param1, int param2) { return param1 + param2; } public String echo(String mesg) { return "echo" + mesg; } public static void main(String[] args) throws Exception { Class classType = InvokeTester.class; Object invokertester = classType.newInstance(); Method addMethod = classType.getMethod("add", new Class[] { int.class, int.class }); //Method類的invoke(Object obj,Object args[])方法接收的引數必須為物件, //如果引數為基本型別資料,必須轉換為相應的包裝型別的物件。invoke()方法的返回值總是物件, //如果實際被呼叫的方法的返回型別是基本型別資料,那麼invoke()方法會把它轉換為相應的包裝型別的物件, //再將其返回 Object result = addMethod.invoke(invokertester, new Object[] { new Integer(100), new Integer(200) }); //在jdk5.0中有了裝箱 拆箱機制 new Integer(100)可以用100來代替,系統會自動在int 和integer之間轉換 System.out.println(result); Method echoMethod = classType.getMethod("echo", new Class[] { String.class }); result = echoMethod.invoke(invokertester, new Object[] { "hello" }); System.out.println(result); } }
public class Test {
public static void main(String[] args) throws Exception {
String field = "UserName";
String methodName = "";
World world = new World();
Class xom = world.getClass();
methodName = "set"+field;
Method method = xom.getMethod(methodName, String.class);
Object[] obj = new Object[1];
obj[0] = "guolei";
method.invoke(world, obj);
// System.out.println(world.getUserName());
methodName = "get"+field;
Method method2 = xom.getMethod(methodName);
System.out.println(method2.invoke(world));
}
}