2012-09-02 160 views
0

我想編寫一個程序,它決定在運行時調用對象的方法。使用反射動態調用方法

例如

<method>getXyz<operation> 
<arg type="int"> 1 <arg> 
<arg type="float"> 1/0 <arg> 

現在我已經在XML文件中類似上面,我想決定在運行時調用哪個方法。可以有多種方法。

我不想做這樣的事情在我的代碼如下:

if (methodNam.equals("getXyz")) 
    //call obj.getXyz() 

我怎樣才能做到這一點使用Java反射?

另外我想在運行時構造參數列表。例如,一種方法可以採用參數,另一種可以採用n參數。

回答

2

您應該首先使用Object.getClass()方法獲取Class對象。

那麼你應該使用Class.getMethod()Class.getDeclaredMethod()得到Method,最後使用Method.invoke()調用此方法。

實施例:

public class Tryout { 
    public void foo(Integer x) { 
     System.out.println("foo " + x); 
    } 
    public static void main(String[] args) throws Exception { 
     Tryout myObject = new Tryout(); 
     Class<?> cl = myObject.getClass(); 
     Method m = cl.getMethod("foo", Integer.class); 
     m.invoke(myObject, 5); 
    } 
} 

此外,我希望構造參數列表在runtime.For實施例一個方法 可以採取2個參數和其它可以取n ARGS

這不是一個問題,只需創建陣列Class<?>對於類型的參數,以及一個數組Object s的參數值,並將它們傳遞給getMethod()invoke()。它可以工作,因爲這些方法接受Class<?>...作爲參數,並且一個數組適合它。

-1

請仔細看看java.beans.Statementjava.beans.Expression。進一步的細節見here

2

您可以使用下面的代碼以類方法使用反射

package reflectionpackage; 
public class My { 
    public My() { 
    } 
    public void myReflectionMethod(){ 
     System.out.println("My Reflection Method called"); 
    } 
} 
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException 
{ 
     Class c=Class.forName("reflectionpackage.My"); 
     Method m=c.getDeclaredMethod("myReflectionMethod"); 
     Object t = c.newInstance(); 
     Object o= m.invoke(t);  
    } 
} 

這會工作,併爲進一步的參考,請按照鏈接 http://compilr.org/java/call-class-method-using-reflection/