2017-05-31 43 views
-2

當我通過反射搜索方法時,它顯示新提供的方法。但我不知道如何調用這種方法,如果有人知道如何去做,請告訴我。java匿名類作爲參數與新方法

//some pakage 
pakage xyz; 

class A { 
    // a simple method of class A 
    public void aMethod() { 
     //simple print statement 
     System.out.println("A class method"); 
    } 
} 

class B { 
    // a method of class B that takes A types as an argument 
    public void bMethod(A arg) { 
     Class c = Class.forName("xyz.A"); 

     Method[] methods = c.getDeclaredMethods(); 
     for (Method method : methods) { 
      System.out.println(method.getName()); 
     } 
    } 
} 

class Test { 
    public static void main(String[] args) { 
     B bObj = new B(); 
     bObj.bMethod(new A() { 
      public void anotherMethod() { 
       System.out.println("another method"); 
      } 
     }); 
    } 
} 
+0

請先格式化您的代碼。 – weaver

+0

我格式化了你的問題和你的代碼,並修復了明顯的錯誤。下一次,我會冷靜下來。在寫問題時要小心。 –

+1

你也應該在更高層次上解釋你想要達到的目標。你爲什麼使用反射?你爲什麼使用這樣的匿名類和其他方法無法調用。但無論如何,如果你想找到這個額外的方法,你需要獲得'arg'類的方法。不是A. –

回答

0

您可以使用反射來調用特定對象上的方法:

public void invokeSomeMethodOnA(A arg, String methodName) { 
    Method method = arg.getClass().getDeclaredMethod(methodName); 

    //To invoke the method: 
    method.invoke(arg, parameters here); 
} 
+0

method.invoke(obj,這裏的參數);它是參數中的同一個對象(obj)嗎? – Ankur

+0

是的,該方法將在與參數相同的對象上調用。 –

+0

好的,謝謝你krzysztof-cichocki – Ankur

0

我想也許這就是你想要的。

package xyz; 

import java.lang.reflect.Method; 

class A { 
    // a simple method of class A 
    public void aMethod() { 
     //simple print statement 
     System.out.println("A class method"); 
    } 
} 

class B { 
    // a method of class B that takes A types as an argument 
    public void bMethod(A arg) throws Exception { 
     Class c = Class.forName(arg.getClass().getName()); 

     Method[] methods = c.getDeclaredMethods(); 
     for (Method method : methods) { 
      System.out.println(method.getName()); 
      method.invoke(arg); 
     } 
    } 
} 

class Test { 
    public static void main(String[] args) throws Exception { 
     B bObj = new B(); 
     bObj.bMethod(new A() { 
      public void anotherMethod() { 
       System.out.println("another method"); 
      } 
     }); 
    } 
}