这是我的代码。
String name = "expevaluator." + super.left.getClass().getSimpleName() + super.right.getClass().getSimpleName() + "Addition";
try {
Object instance;
instance = Class.forName(name).newInstance();
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex) {
Logger.getLogger(Addition.class.getName()).log(Level.SEVERE, null, ex);
}
我试图调用变量" name"的评估函数。类。
这是评估功能。
public Number evaluate(int left, int right) {
return left + right;
}
这是IntegerIntegerAddition Class
中的evaluate方法我还有IntegerDoubleAddition类评估方法
public Number evaluate(int left, double right) {
return left + right;
}
因此变量名称可以包含" IntegerIntegerAddition"或" IntegerDoubleAddition" 我希望他们两个用2个参数调用Evaluate方法。
答案 0 :(得分:2)
您需要使用真实方法所需的名称和参数类型来创建Method对象。然后,您希望使用对具有该方法的对象的引用,并在其上调用您的Method引用。
//These are all the types that my example references will use.
Object obj; //The instance that my method is going to be invoked on.
Object[] params; //The parameters for my method
String nameOfMethod; //The name of my method.
Class<?>[] paramTypes; //The types, in order, that my method accepts as parameters
Method m = obj.getClass().getMethod(nameOfMethod, paramTypes); //Create my Method object
m.invoke(obj, params); //Invoke that method!
getMethod()接受数组paramTypes的vararg。因此,您可以直接在其中列出您的类型作为单独的参数。与Method.invoke()相同的是它的params参数。
m.invoke(obj, param1, param2, param3) //etc
答案 1 :(得分:0)
你可以这样做:
Method evaluate = instance.getClass().getDeclaredMethod( "evaluate", int.class, int.class );
evaluate.invoke( instance, 3, 1 );
这应该通过参数类型找到确切的方法(或者使用“int.class,long.class”作为第二种方法)&amp;调用它,这里使用示例参数3&amp; 1。 记得抓住可能的例外情况。