是否有可能在Java来通过反射访问私有字段[复制]是否有可能在Java来通过反射访问私有字段[复制]

2019-05-06 11:59发布

这个问题已经在这里有一个答案:

  • 如何从Java中的不同类阅读私有字段的值? 11个回答

是否有可能在Java来通过反射访问私有字段海峡? 例如,要得到这个字段的值。

class Test
{
   private String str;
   public void setStr(String value)
   {
      str = value;
   }
}

Answer 1:

是的,这绝对是 - 假设你有适当的安全权限。 使用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);
    }
}

不,你不应该通常做这个...它颠覆类的原作者的意图。 例如,可以很好地验证在该领域通常可以设置,或其他字段可以在相同的时间被改变的任何情况施加。 你有效地破坏封装的预期水平。



Answer 2:

是。

  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方法



Answer 3:

对的,这是可能的。

您需要使用getDeclaredField方法(而不是getfield命令法),用你的私有字段的名称:

Field privateField = Test.class.getDeclaredField("str");

此外,你需要设置这个字段可以访问,如果你想访问一个私有字段:

privateField.setAccessible(true);

一旦这样做了,你可以使用Field实例get方法,来访问STR字段的值。



文章来源: Is it possible in Java to access private fields via reflection [duplicate]