Ответ 1
Да, это абсолютно так - если у вас есть соответствующие разрешения безопасности. Используйте Field.setAccessible(true)
сначала, если вы обращаетесь к нему из другого класса.
import java.lang.reflect.*;
class Other
{
private String str;
public void setStr(String value)
{
str = value;
}
}
class Test
{
public static void main(String[] args)
// Just for the ease of a throwaway test. Don't
// do this normally!
throws Exception
{
Other t = new Other();
t.setStr("hi");
Field field = Other.class.getDeclaredField("str");
field.setAccessible(true);
Object value = field.get(t);
System.out.println(value);
}
}
И нет, обычно вы не должны этого делать... это подрывает намерения автора оригинала. Например, вполне может быть применена валидация в любой ситуации, когда поле обычно может быть установлено, или другие поля могут быть изменены одновременно. Фактически вы нарушаете предполагаемый уровень инкапсуляции.