Вызвать метод класса Inner, имеющий параметры, используя отражение - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь протестировать свой код, хотя знание того, что использование рефлексии не является хорошим способом тестирования.У меня есть внешний класс как открытый, имеющий закрытый внутренний класс с открытым методом, как показано ниже:

public class Outer {

    private class Inner {
        private int var = 1;

        public Inner(int a) {
            System.out.println("___");
        }

        public void test(int a) {
            System.out.println("Hey");
        }
    }
}

Мой основной класс Java выглядит следующим образом

main() {
    Outer b = new Outer();
    System.out.println(b);
    Class<?> innerClass = Class.forName("car.Outer$Inner");

    Constructor<?> constructor = innerClass.getDeclaredConstructor(Outer.class, 1);

    constructor.setAccessible(true);
    Object c = constructor.newInstance(b,b);

    Method method = c.getClass().getDeclaredMethod("test");
    method.setAccessible(true);
    method.invoke(c, 1);
}

Это бросает

Исключение в потоке "main" java.lang.NoSuchMethodException: car.Outer $ Inner.test () в java.lang.Class.getDeclaredMethod (Class.java:2130) в car.A.main (A.Java: 36)

Как вызвать метод внутреннего класса, принимая параметр, используя отражение?

1 Ответ

0 голосов
/ 27 сентября 2018

Вам необходимо указать класс (ы) аргумента при вызове getDeclaredMethod().Когда вы вызываете getDeclaredMethod(), первый аргумент - это имя метода, который вы хотите найти, а оставшиеся аргументы - это классы аргумента (ов) для метода, который вы хотите.Вот как getDeclaredMethod() различает перегруженные имена методов, чтобы получить один конкретный метод.Поскольку вы не указали никаких дополнительных аргументов, getDeclaredMethod() ищет метод с именем test, который не принимает аргументов.Вы получаете исключение, потому что у вас нет такого метода в классе Outer$Inner.Единственный метод test, который у вас есть, принимает int параметр`, поэтому следующее должно делать то, что вы хотите:

Method method = c.getClass().getDeclaredMethod("test", int.class);

Здесь int.class - это объект Class, соответствующий примитивутип аргумента int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...