Можно ли вызвать частные атрибуты или методы с помощью отражения - PullRequest
37 голосов
/ 02 августа 2011

Я пытался получить значение статического частного атрибута с помощью отражения, но он завершился ошибкой.

Class class = home.Student.class;
Field field = studentClass.getDeclaredField("nstance");
Object obj = field.get(null);

Исключение, которое я получаю:

java.lang.IllegalAccessException: Class com.test.ReflectionTest can not access a member of class home.Student with modifiers "private static".

Более тогоесть частный объект, который мне нужно вызвать со следующим кодом.

Method method = studentClass.getMethod("addMarks");
method.invoke(studentClass.newInstance(), 1);

, но проблема в том, что класс Student является одноэлементным классом, а конструктор является закрытым и недоступен.

Ответы [ 3 ]

72 голосов
/ 02 августа 2011

Вы можете установить доступное поле:

field.setAccessible(true);
13 голосов
/ 02 августа 2011

Да, это так.Вы должны установить их доступными, используя setAccessible(true), определенный в AccesibleObject , который является суперклассом Field и Method

Со статическим полем вы должны иметь возможность:

Class class = home.Student.class;
Field field = studentClass.getDeclaredField("nstance");
field.setAccessible(true); // suppress Java access checking
Object obj = field.get(null); // as the field is a static field  
                              // the instance parameter is ignored 
                              // and may be null. 
field.setAccesible(false); // continue to use Java access checking

И с закрытым методом

Method method = studentClass.getMethod("addMarks");
method.setAccessible(true); // exactly the same as with the field
method.invoke(studentClass.newInstance(), 1);

И с закрытым конструктором:

Constructor constructor = studentClass.getDeclaredConstructor(param, types);
constructor.setAccessible(true);
constructor.newInstance(param, values);
1 голос
/ 02 августа 2011

Да, вы можете "обмануть" вот так:

    Field somePrivateField = SomeClass.class.getDeclaredField("somePrivateFieldName");
    somePrivateField.setAccessible(true); // Subvert the declared "private" visibility
    Object fieldValue = somePrivateField.get(someInstance);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...