在Java中,是否可以通过反射访问私有字段

在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

在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);
    }
}
不,你通常不应该这样做。。。这颠覆了课程原作者的意图。例如,在通常可以设置字段或同时更改其他字段的任何情况下,都可能应用验证。您实际上违反了预期的封装级别。

  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它是一个引用变量,指向带有私有字段的类的实例。