Этот ответ не совсем точен. Язык Java (и его компиляторы) создают некоторые иллюзии, которые не сохраняются после компиляции. API отражения работает с результирующим байт-кодом и не знает ничего, что сметается компилятором.

я есть две единицы компиляции:

public class OuterClass{

    private static class InnerClass{

        public String test(){
            return "testing123";
        }
    }

    public static void main( String[] args ){
        new CallingClass().test( new InnerClass() );
    }
}


public class CallingClass{

    public void test( Object o ){
        try{
            Method m = o.getClass().getMethod( "test" );
            Object response = m.invoke( o );
            System.out.println( "response: " + response );
        }
        catch( Exception e ){
            e.printStackTrace();
        }
    }
}

Если они находятся в одном пакете, все работает и выводится «response: testing123». Если они находятся в отдельных пакетах, генерируется IllegalAccessException.

Как я понимаю, исключение выдается, потому что CallingClass не может вызывать частные методы InnerClass. Но что я не понимаю, почему это разрешено в той же упаковке? InnerClass не защищен. Приватный не должен быть виден за пределами OuterClass, даже если он находится в том же пакете. Я понимаю, что-то не так?

Ответы на вопрос(2)

Ваш ответ на вопрос