我想编写一个程序来决定在运行时调用对象的方法。
例如
<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
个参数。
答案 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.Statement
和java.beans.Expression
。有关详细信息,请参阅here。