使用反射动态调用方法

时间:2012-09-02 08:23:23

标签: java reflection

我想编写一个程序来决定在运行时调用对象的方法。

例如

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

现在我在XML文件中有类似的东西,我想决定在运行时调用哪个方法。可以有多种方法。

我不想在我的代码中执行以下操作:

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

如何使用Java反射来完成?

我还想在运行时构造参数列表。例如,一种方法可以采取 2个参数和另一个参数可以采用n个参数。

3 个答案:

答案 0 :(得分: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);
    }
}
  

我还想在运行时构造参数列表。例如一   方法可以取2个参数,其他可以取n个参数

这不是问题,只需为参数的 types 创建Class<?>数组,以及Object的数组{参数的值,并将它们传递给getMethod()invoke()。这是有效的,因为这些方法接受Class<?>...作为参数,并且数组适合它。

答案 1 :(得分: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/

答案 2 :(得分:-1)

好好了解java.beans.Statementjava.beans.Expression。有关详细信息,请参阅here