是否有可能在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字段的值。