-2

我正在使用 Java 反射进行测试,并尝试根据参数的类型将重载方法应用于参数。

但是,即使我尝试获取的方法是公开的,我也有 NoSuchMethodException。当我使用 getDeclaredMethod 时,仍然会出现此异常。

这是主程序

public class Test {

    public static void main(Object... inputs){

        InputManipulation test = new InputManipulation();

        for (Object input: inputs){
            Class ownerClass = test.getClass();
            Class inputClass = input.getClass();
            Method method = ownerClass.getDeclaredMethod("add", inputClass);
            method.invoke(test, "Testing reflection");
        }

    }
}

这是自定义的 InputManipulation 类

public class InputManipulation {

    Integer total;

    public InputManipulation(){this.total = 0;}

    public void add(Integer num){this.total += num;}
    public void add(String str){System.out.println(str);}
}

提前致谢!

我现在将Test类更改如下..但问题仍然存在。

public class Test {

    public static void main(String[] args){
        Test testExample = new Test();
        testExample.testMethod("String1", 1, "String2");
    }

    public void testMethod(Object... inputs){
        InputManipulation test = new InputManipulation();
        for (Object input: inputs){
            Class ownerClass = test.getClass();
            Class inputClass = input.getClass();
            Method method = ownerClass.getDeclaredMethod("add", inputClass);
            method.invoke(test, "Testing reflection");
        }

    }
}

正如另一篇文章所建议的那样,我还尝试将 inputClass 放入 Class 数组中,但它没有帮助..

4

2 回答 2

0
public class Test {

public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
    Test testExample = new Test();
    testExample.testMethod("String1", 1, "String2");
}

public void testMethod(Object... inputs) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
    InputManipulation test = new InputManipulation();
    for (Object input: inputs){
        Class ownerClass = test.getClass();
        Class inputClass = input.getClass();
        Method method = ownerClass.getDeclaredMethod("add", inputClass);
        method.invoke(test, input);
    }
}
}

您的问题是由此引起的 method.invoke(test, "Testing reflection"); 您遍历 2 种类型的参数,并取决于您调用方法“添加”的此参数。当您尝试使用参数 Integer 调用方法时,您传递给导致错误的方法 String 参数

于 2018-06-08T12:34:42.680 回答
0

您提供的初始代码似乎存在一些问题,正如其他人建议的那样,使用 IDE 会很快指出一些问题。但是,我已经接受了您的更新并修复了代码以在您提供的输入类型的循环中调用正确的方法。

首先像这样更改您的 InputManipulation 类:

public class InputManipulation {

    Integer total;

    public InputManipulation() {
        this.total = 0;
    }

    public void add(Integer num) {
        this.total += num;
        System.out.println(this.total);
    }

    public void add(String str) {
        System.out.println(str);
    }

}

现在改变你的测试类,如下所示:

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test {

    public static void main(String[] args) {
         Test testExample = new Test();
            testExample.testMethod("String1", 1, "String2");
    }

     public void testMethod(Object... inputs){
            InputManipulation test = new InputManipulation();
            for (Object input: inputs){

                Class<? extends Object> ownerClass = test.getClass();
                Class<? extends Object> inputClass = input.getClass();
                //Method method;    //not needed

                try {
                    ownerClass.getDeclaredMethod("add", inputClass).invoke(test, input);

                } catch (NoSuchMethodException | SecurityException | 
                        IllegalAccessException | IllegalArgumentException |
                        InvocationTargetException e) {

                    e.printStackTrace();
                }

            }

      }
}

我使用这些读数来帮助指导我的答案,但改变了我调用该方法的方式:

http://tutorials.jenkov.com/java-reflection/methods.html

于 2018-06-08T12:37:19.943 回答