我想澄清一些事情。使用「普通」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而已?有人有一個想法如何發生?
我不能完全肯定,但你嘗試過'場場= MyClass的訪問。 class.getDeclaredField( 「字段1」);'?這可能是區別... – user219882 2012-04-13 23:10:33
是的,唯一的問題是,getDeclaredField將只給我這個類聲明的字段,而不是任何祖先。我看到如何繞過這個問題(遍歷祖先),但看起來有點像書寫枯燥的樣板代碼... – Sergio 2012-04-13 23:45:16
無標籤「番石榴」,因爲這個問題與番石榴無關。 – 2012-04-14 14:26:09