2010-05-26 2 views
1

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

ответ

3

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

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

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

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

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

+1

Почему явный 'новый' работает, даже если это' частный'? – polygenelubricants

+0

Я думаю, потому что отражение устраняет контекст, а контекст заключается в том, что внутренний класс принадлежит внешнему. Сам объект класса сохраняет ссылку на охватывающий класс, но конструктор этого не делает. – Bozho

+0

3x, Bozho. «контекст» - это то, что мне действительно интересно. ИМХО, у Конструктора должно быть достаточно информации, чтобы знать класс enclsong, и нет никаких оснований для его реализации таким образом. – MikeJiang

2

Это Bug ID 4221909:

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

+0

и очень старый :) – Bozho

Смежные вопросы