2013-08-22 19 views
0

有一天,我打算在ACL模塊的源代碼在彈簧安全(3.0.x的分支),我發現,ACLImpl對象有一個私人組ACE的(以分貝表示的由1許多反射)。進一步深入瞭解代碼,我發現沒有明顯的一點就是私有的ace集合被填充。我花了一段時間來找到人口與java.lang.reflect.Field做:Usecases的Java java.lang.reflect.Field中?

private final Field fieldAces = FieldUtils.getField(AclImpl.class, "aces"); 
... 
fieldAces.setAccessible(true); 
... 
try { 
    fieldAces.set(acl, aces); 
} catch (IllegalAccessException e) { 
    throw new IllegalStateException("Could not set AclImpl entries", e); 
} 

(所有代碼BasicLookupStrategy.java複製) 我認爲現場主要是用來披露模糊的罐子私人領域。除了混淆代碼流之外,還有其他什麼原因嗎?

+0

JSON結合,XML綁定,奧姆斯:所有這些訪問您的POJO領域的反射序列化/他們JSON,XML或數據庫表反序列化/。 –

+0

我只是問自己:任何真正的,大規模的使用情況下,當不使用它? – ppeterka

回答

2

除了訪問私有的或其他不可訪問的字段,java.lang.reflect.Field的作用與整個反射機制相同:通過動態發現和處理在編譯時不一定知道的類型。與許多其他語言一樣,Java是靜態類型的。反射機制允許一個繞過它在一定程度上,並引進一些更具活力的功能,如,也就是說,按名稱的字段的值檢索。這是非常寶貴的,儘可能的通過一些工具,我們認爲理所當然執行「神奇」依賴於它 - 想JUnit的,嘲諷的框架,休眠,JAXP,GSON ...模糊處理的代碼流,但精彩過多的一個事情你可以使用java.lang.reflect.Field中的:)