我想澄清一些事情。
使用“普通”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存在?有人知道这是怎么发生的吗?
答案 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()等方法访问您的私有字段