Java尝试做反射(运行时的类实例和调用方法)

时间:2014-04-02 15:25:06

标签: java reflection runtime

这是我的代码。

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方法。

2 个答案:

答案 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。 记得抓住可能的例外情况。