问题
这个问题在这里已有答案:
如何从Java中的不同类读取私有字段的值? 10个答案
在Java中是否可以通过反射访问私有字段str?例如,获取此字段的值。
class Test
{
private String str;
public void setStr(String value)
{
str = value;
}
}
#1 热门回答(167 赞)
是的,绝对是 - 假设你已获得适当的安全权限。如果你从其他班级访问它,请首先使用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);
}
}
不,你通常不应该这样做......它颠覆了班级原作者的意图。例如,在可以正常设置字段或者可以同时改变其他字段的任何情况下都可以应用验证。你实际上违反了预期的封装级别。
#2 热门回答(45 赞)
是。
Field f = Test.class.getDeclaredField("str");
f.setAccessible(true);//Very important, this allows the setting to work.
String value = (String) f.get(object);
然后使用field对象获取类实例的值。
请注意,get方法通常会让人感到困惑。你有该字段,但你没有该对象的实例。你必须将它传递给get方法
#3 热门回答(5 赞)
对的,这是可能的。
你需要使用getDeclaredField方法(而不是getField方法),以及你的私有字段的名称:
Field privateField = Test.class.getDeclaredField("str");
此外,如果要访问私有字段,则需要将此字段设置为可访问:
privateField.setAccessible(true);
完成后,你可以在Field实例上使用get方法来访问str字段的值。