Вызов частного метода внутри частного класса во внутреннем классе - PullRequest
1 голос
/ 21 марта 2020

Необходимо вызвать закрытый метод foo() класса Inner.Private , где Private - внутренний закрытый класс из основного метода основного класса. Код выглядит примерно так:

public class MainClass {
    public static void main(String[] args) throws Exception {
        // Need to invoke foo() from here
        } 

    static class Inner {
        private class Private {
            private String foo() {
                return "someString";
            }
        }
    }
}

Я пытался получить это с помощью Java Reflection, но у меня возникают проблемы с этим подходом.

Моя попытка вызвать foo() is:

        Inner innerClassObject = new Inner();
        Method method = Inner.Private.class.getDeclaredMethod("foo");
        method.setAccessible(true);
        method.invoke(innerClassObject);

Но это дает исключение NoSuchMethodException:

Exception in thread "main" java.lang.NoSuchMethodException: 
default.MainClass$Inner$Private.foo()
    at java.lang.Class.getDeclaredMethod(Unknown Source) 

Я застрял в этой точке, достижимо ли это с помощью Java Reflection или любым другим способом?

Ответы [ 3 ]

2 голосов
/ 21 марта 2020

Ммм ... почему бы не просто new Inner().new Private().foo()?

0 голосов
/ 21 марта 2020

Зачем тратить инстанцирование просто для вызова метода, как было описано? По мере развития классов вы неизбежно захотите сохранить различные экземпляры для последующего использования.

public class MainClass {
    public static void main(String[] args) throws Exception {
        // Need to invoke foo() from here
        Inner inner = new Inner();
        Inner.Private pvt = inner.new Private();
        System.out.println(pvt.foo());
    }

    static class Inner {
        private class Private {
            private String foo() {
                return "someString";
            }
        }
    }
}

Печать

someString
0 голосов
/ 21 марта 2020

Почему вы это делаете

Inner.Private.class

Вместо

innerClassObject.getClass()

Например:

public class Test {


private int foo(){
    System.out.println("Test"); 
    return 1;
}
public static void main(String [] args) throws InterruptedException, 
NoSuchMethodException, IllegalAccessException, IllegalArgumentException, 
InvocationTargetException
{
  Test innerClassObject = new Test();
    Method method = 
    innerClassObject.getClass().getDeclaredMethod("foo",null);
    method.setAccessible(true);
    method.invoke(innerClassObject);
}


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