Получение NoSuchMethodException из getMethod с использованием отражения Java
Я тестирую с помощью отражения 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 ответа
Кажется, что есть некоторые проблемы с исходным кодом, который вы предоставили, и, как другие предложили использовать 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();
}
}
}
}
Я использовал эти чтения, чтобы помочь направить свой ответ, но изменил способ, которым я вызвал метод:
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 типа аргументов и в зависимости от этого аргумента вы вызываете метод 'add'. Когда вы пытались вызвать метод с аргументом Integer, вы передаете в метод String параметр, который вызывает ошибку