【问题标题】:Java Trying to do reflection(class instance and invoke method at runtime)Java试图做反射(类实例和运行时调用方法)
【发布时间】:2014-05-14 00:15:38
【问题描述】:

这是我的代码。

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 类的评估方法

我也有 IntegerDoubleAddition 类评估方法

public Number evaluate(int left, double right) {
    return left + right;
}

所以变量名可以有“IntegerIntegerAddition”或“IntegerDoubleAddition” 我希望他们都使用 2 个参数调用 Evaluate 方法。

【问题讨论】:

  • 好的,所以你需要通过反射获取相关方法并调用它——你为那部分尝试了什么?
  • 我不确定您想要达到的目标。我觉得您正在尝试做的事情在这里缺少一些上下文。

标签: java reflection runtime


【解决方案1】:

您需要使用实际方法所需的名称和参数类型来创建 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 的可变参数。因此,您可以将您的类型作为单独的参数一一列出。 Method.invoke() 与它的 params 参数相同。

m.invoke(obj, param1, param2, param3) //etc

【讨论】:

    【解决方案2】:

    你可以这样做:

    Method evaluate = instance.getClass().getDeclaredMethod( "evaluate", int.class, int.class );
    evaluate.invoke( instance, 3, 1 );
    

    这应该通过参数类型找到确切的方法(或者使用“int.class,long.class”作为您的第二种方法)并调用它,这里使用示例参数 3 和 1。 记得捕捉可能的异常。

    【讨论】:

    • 但我不知道参数原始类型可能是 int int、int double、double int 或 double double
    • 如果您有接受不同参数的重载方法,则需要在某处放置逻辑以确定将选择哪种方法。这可能意味着组合您的方法以接受更通用的参数类型并在内部进行此类型检查,或者在实例化 Method 对象之前检查您的值的类型,并有一个案例使用当前情况使用正确的类型创建它。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    相关资源
    最近更新 更多