Можно ли вызывать частные атрибуты или методы посредством отражения - программирование

Можно ли вызывать частные атрибуты или методы посредством отражения

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

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 является одноэлементным классом, а конструктор - закрытым и не может быть доступен.

4b9b3361

Ответ 1

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

field.setAccessible(true);

Ответ 2

Да, это так. Вы должны установить их с помощью 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);

Ответ 3

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

    Field somePrivateField = SomeClass.class.getDeclaredField("somePrivateFieldName");
    somePrivateField.setAccessible(true); // Subvert the declared "private" visibility
    Object fieldValue = somePrivateField.get(someInstance);