使用Java反射从getMethod获取NoSuchMethodException

时间:2018-06-08 12:12:02

标签: java get-method

我正在测试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数组中,正如另一篇文章所建议的那样,但它没有帮助..

2 个答案:

答案 0 :(得分: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参数

答案 1 :(得分: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);
    }

}

现在改变你的Test类:

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