在Java中,是否可以通过反射访问私有字段
在Java中,是否可以通过反射访问私有字段str? 例如,获取此字段的值在Java中,是否可以通过反射访问私有字段,java,reflection,Java,Reflection,在Java中,是否可以通过反射访问私有字段str? 例如,获取此字段的值 class Test { private String str; public void setStr(String value) { str = value; } } 是的,它绝对是-假设你有适当的安全权限。如果从其他类访问它,请首先使用Field.setAccessible(true) import java.lang.reflect.*; class Other { p
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);
然后使用field对象获取类实例上的值
请注意,get方法常常让人感到困惑。您有字段,但没有对象的实例。您必须将其传递给get
方法是的,这是可能的
您需要使用getDeclaredField方法(而不是getField方法),并使用您的私有字段名称:
Field privateField = Test.class.getDeclaredField("str");
privateField.setAccessible(true);
此外,如果要访问专用字段,则需要将此字段设置为可访问:
Field privateField = Test.class.getDeclaredField("str");
privateField.setAccessible(true);
完成后,您可以在字段实例上使用get方法来访问str字段的值。如果问题中包含“我尝试了这个…”以及相关代码,则问题会有很大的改进。这个问题是一个重复的问题-已经被问过并回答过几次了。您应该这样做的实例很少,正如乔恩所说。不幸的是,我不得不做得比我愿意承认的还要多,这使得代码非常难看。很好的更正。(请参阅Java编程语言安全编码指南2.0版的准则6-4:)@Downvoter:Care解释原因?@JonSkeet为什么Java允许它访问私有成员?为什么java创建了
setAccessible()
method?@IslamEl Rougy:对于其他恼人的情况,反射通常是一种实用的解决方案。在可能的情况下,这绝对值得避免,而且往往是一个糟糕的解决方案。我不知道我是否会完全禁止它,但我至少会一直很紧张。对象是什么?
?@Gevorg它是一个引用变量,指向带有私有字段的类的实例。