Исключение, когда доступ к внутреннему классу рефлексивно - PullRequest
1 голос
/ 26 мая 2010

Вот пример программы, протестированной на 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 {
    }
}

Ответы [ 2 ]

3 голосов
/ 26 мая 2010

Класс является личным, следовательно, 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 голосов
/ 26 мая 2010

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

Synopsys : (отразить) Class.newInstance() выбрасывает IllegalAccessErrorException, когда класс имеет внутренний не public class
Состояние : 6-Исправлено, ошибка
Приоритет : 4-низкий
Дата отправки : 19 марта 1999 года

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