2

我想澄清一件事。

使用“普通”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;}
}

然后番石榴反射代码正在工作。我不得不承认我对此有点茫然。我知道反射库可以使用 getter 来返回私有实例变量的值,但是 Field 对象本身只是因为 getter 存在?有人知道这是怎么发生的吗?

4

2 回答 2

4

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

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

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

无论如何,作为最佳实践,请考虑仅对公共成员使用反射,因此请尽可能使用 getter/setter。

希望有帮助。

于 2012-04-13T23:10:47.740 回答
1

Field扩展了 AccesibleObject,它有一个方法setAccessible(),允许您访问私有字段的值。

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

于 2012-04-13T23:15:18.860 回答