Получение NoSuchMethodException из getMethod с использованием отражения Java - PullRequest
0 голосов
/ 08 июня 2018

Я тестирую с помощью отражения 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 голосов
/ 08 июня 2018

Похоже, что есть некоторые проблемы с исходным кодом, который вы предоставили, и, как другие предлагали использовать 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

0 голосов
/ 08 июня 2018
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, который вызывает ошибку

...