在Java中,通过反射是否可以访问私有字段str?例如获取该字段的值。
class Test
{
private String str;
public void setStr(String value)
{
str = value;
}
}
在Java中,通过反射是否可以访问私有字段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);
}
}
不,通常情况下你不应该这样做……这是违反类的原始作者意图的。例如,在可以通常设置字段的任何情况下,可能会应用验证,或者同时更改其他字段。您实际上正在违反所期望的封装级别。
setAccessible()
方法? - Asif Mushtaq 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
方法。
object
? - Marsellus Wallace是的,这是可能的。
您需要使用getDeclaredField方法(而不是getField方法),并提供您私有字段的名称:
Field privateField = Test.class.getDeclaredField("str");
privateField.setAccessible(true);
完成这一步后,您可以使用Field实例上的get方法来访问str字段的值。