这个问题已经在这里有一个答案:
- 如何从Java中的不同类阅读私有字段的值? 11个回答
是否有可能在Java来通过反射访问私有字段海峡? 例如,要得到这个字段的值。
class Test
{
private String str;
public void setStr(String value)
{
str = value;
}
}
这个问题已经在这里有一个答案:
是否有可能在Java来通过反射访问私有字段海峡? 例如,要得到这个字段的值。
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);
}
}
不,你不应该通常做这个...它颠覆类的原作者的意图。 例如,可以很好地验证在该领域通常可以设置,或其他字段可以在相同的时间被改变的任何情况施加。 你有效地破坏封装的预期水平。
是。
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字段的值。