是否有可能在Java中通过reflection访问私人领域

在Java中可以通过reflection访问私有字段str吗? 比如要获得这个字段的值。

class Test { private String str; public void setStr(String value) { str = value; } } 

是的,它绝对是 – 假设你有适当的安全权限。 如果您从其他类访问它,请首先使用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); } } 

不,你通常不应该这样做……这是颠覆了原作者的意图。 例如,在任何可以正常设置字段的情况下,或者在其他字段可以同时改变的情况下,可以进行validation。 你实际上违反了预期的封装级别。

是。

  Field f = Test.class.getDeclaredField("str"); f.setAccessible(true);//Very important, this allows the setting to work. String value = (String) f.get(object); 

然后使用该字段对象来获取该类的实例的值。

请注意get方法常常让人困惑。 你有这个领域,但是你没有这个对象的一个​​实例。 你必须把它传递给get方法

对的,这是可能的。

您需要使用getDeclaredField方法(而不是getField方法)和私有字段的名称:

 Field privateField = Test.class.getDeclaredField("str"); 

此外,如果您想访问私人字段,则需要将此字段设置为可访问:

 privateField.setAccessible(true); 

一旦完成,您可以在Field实例上使用get方法来访问str字段的值。