2012-08-03 73 views
0

我一直在尋找最近在java中的反思,我想出了一個簡單的例子使用思考:如何檢驗方法

Reflection.java

import java.lang.reflect.*; 

    public class Reflection{ 
    } 

    public static void main(String args[]) 
    { 
    try { 
     Class cls = Class.forName("Method"); 

     Method methlist[] 
      = cls.getDeclaredMethods(); 
     for (int i = 0; i < methlist.length; 
      i++) { 
      Method m = methlist[i]; 
      System.out.println("name 
      = " + m.getName()); 
      System.out.println("decl class = " + 
          m.getDeclaringClass()); 
      Class pvec[] = m.getParameterTypes(); 
      for (int j = 0; j < pvec.length; j++) 
       System.out.println(" 
       param #" + j + " " + pvec[j]); 
      Class evec[] = m.getExceptionTypes(); 
      for (int j = 0; j < evec.length; j++) 
       System.out.println("exC#" + j 
       + " " + evec[j]); 
      System.out.println("return type = " + 
           m.getReturnType()); 
      System.out.println("-----"); 
     } 
    } 
    catch (Throwable e) { 
     System.err.println(e); 
    } 
    } 
} 

Method.java

public class Method { 
    private int f1(
    Object p, int x) throws NullPointerException 
    { 
    if (p == null) 
     throw new NullPointerException(); 
    return x; 
    } 

從上面的例子我能夠返回所有信息從Method.java看起來像這樣

name = f1 
decl class = class Method 
param #0 class java.lang.Object 
param #1 int 
exC#0 class java.lang.NullPointerException 
return type = int 
----- 
name = main 
decl class = class method1 
param #0 class [Ljava.lang.String; 
return type = void 
----- 

但我的問題是,有沒有辦法從Reflection.java喜歡的東西

int x = cls.getMethod("f1", Object = anObject, Integer.TYPE = 2) 
System.out.println(x); 

和控制檯應該打印出2,因爲F1是傳遞的對象測試Method.java

回答

1

。您需要創建的Method實例調用私有方法f1與這兩個參數。它會返回一個對象。有代碼中的幾個陷阱,但這裏有一個可行的解決方案(注:我改名爲你MethodMyMethod避免名稱衝突:

Method f1Method = MyMethod.class.getDeclaredMethod("f1", Object.class, int.class); 
f1Method.setAccessible(true); 
int result = (Integer) f1Method.invoke(new MyMethod(), 
          new Object[]{new Object(), 2}); 
System.out.println(result); 
  • 的方法是私人所以你需要得到聲明方法,並使其接近
  • 的方法也不是一成不變的,所以我們需要的MyMethod實例調用方法
  • 我們傳遞和接收Java原始類型。int.class是允許的。JA vaDoc告訴我們,即如果該值有一個原語類型,首先適當地包裝在一個對象。因此,我們將收到的Integer一個實例。
+0

謝謝你,它的工作完美,很好地解釋爲好,理解好了很多,現在...謝謝:) – newSpringer 2012-08-03 16:29:30

1

退房的Javadoc for java.lang.reflect.Method。你想方法invoke();

Method m = ... 
Object result = m.invoke(objectToCallMethodOn, firstArgument, secondArgument); 
int x = ((Integer) result).intValue(); 
0

注:Method類我指的是Method class in the JDK,而不是一個你的榜樣

您已經能夠從Class對象找到Method的。您現在可以使用Method#invoke方法來調用該方法的某個對象