Исключение при активном доступе к внутреннему классу

Вот пример программы, протестированной в Java 1.5.

Интересно, почему два подхода ниже имеют разные результаты. Это ошибка или своего рода Java-функция?

package test;

public class TestOut {
    public static void main(String[] args) {
        // works
        new TestIn();

        // throws IllegalAccessException
        Class.forName("test.TestOut$TestIn").newInstance();
    }

    private static class TestIn {
    }
}

Ответы

Ответ 1

Класс является закрытым, поэтому IllegalAccessException - вы можете использовать:

Class cls = Class.forName(...);
Constructor c = cls.getDeclaredConstructors()[0];
c.setAccessible(true);
c.newInstance();

Для записи в исключении есть сообщение, которое довольно наглядно. В следующий раз не опускайте такую ​​информацию из вопроса. (на самом деле, я не уверен, что это сообщение существует на Java 1.5, не так ли?)

Класс test.Test не может получить доступ к члену класса test.TestOut $TestIn с модификаторами "private"

Проблема заключается в методе verifyMemberAccess(..) sun.reflect.Reflection и что он не учитывает охватывающие классы. Если член (конструктор) является закрытым, доступ запрещен.

Ответ 2

Это Идентификатор ошибки 4221909:

Synopsys: (отражение) Class.newInstance() throws IllegalAccess Error Exception, когда класс имеет внутренний не public class
Состояние: 6-Fix Understood, ошибка
Приоритет: 4-Низкий
Дата отправки: 19-MAR-1999