1. 程式人生 > >Java反射機制詳解 及 Method.invoke 解釋

Java反射機制詳解 及 Method.invoke 解釋

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));

}
}