使用Guava Reflection引用私有字段

时间:2012-04-13 23:00:34

标签: java reflection guava

我想澄清一些事情。

使用“普通”Java反射技术(不使用库)afaik无法获得对私有字段的引用(我的意思是java.lang.reflect.Field对象,没有字段值)。

例如,如果我有这个类:

public class MyClass {
  private String field1;
}

如果我尝试执行此操作:

Field field = MyClass.class.getField("field1");

我会按预期获得NoSuchFieldException例外。

使用Guava Reflection library,如果我尝试执行此操作:

Object o = new MyClass();
Property property = Properties.getPropertyByName(o, "field1");
Field f = property.getField();

我得到以下异常:

java.lang.IllegalStateException: Unknown property: field1 in class MyClass

这也是预期的。但是,如果我添加一个getter方法,如下所示:

public class MyClass {
  private String field1;
  public String getField1() {return field1;}
}

然后Guava反射代码正在运行。 我必须承认我对此有点失落。我知道反射库可以使用getter来返回私有实例变量的值,但是Field对象本身只是因为getter存在?有人知道这是怎么发生的吗?

2 个答案:

答案 0 :(得分:3)

您可以使用标准的java反射反映私有字段,这可能是Guava在幕后所做的事情:

Class<?> c = ... some class ...
Field field = c.getDeclaredField("name");
field.setAccessible(true);
Object value = field.get(object);

getDeclaredField允许您获取私人字段。 需要setAccessible来防止安全问题。

无论如何,作为最佳做法,请考虑仅对公共成员使用反思,如果可能的话,请使用getter / setter。

希望有所帮助。

答案 1 :(得分:1)

Field扩展AccesibleObject,其方法为setAccessible(),允许您访问私有字段的值。

Guava-Reflection(请注意,此库与Guava不同)正在使用Property.getFieldValue()等方法访问您的私有字段