2009-10-23 99 views
1

我已經開始由比爾·伯克和理查德·蒙森-Haefel的,並在第4章有這個代碼註解的私有類屬性的容器注入如何在java中工作?

@PersistenceContext(unitName="titan") private EntityManager manager; 

類則有訪問這個領域它永遠不會設置方法(讀取企業Java Beans 3.0書在構造函數中並沒有setter方法)。那麼容器如何設置這個私人領域與一個實際的實例?我假設有一些反射和/或字節碼魔術正在進行 - 這是如何完成的?

回答

4

getDeclaredFields()將返回在類中聲明的字段列表。

容器在所有字段中循環檢查適當的註釋。一旦找到需要的字段,就會在該字段上調用setAccessible(true),以便能夠從通常無法訪問的代碼中對其進行操作。

0
manager.getClass().getDeclaredFields() 

會讓你訪問字段。查看javadocs here

+0

謝謝。對我來說,打破封裝 - 私人成員如果可以任意設置,它有什麼意義?或者這是註釋以某種方式允許的東西? – blank 2009-10-23 18:34:59

+0

如果你遵循破解封裝協議,破解封裝是安全的。 :)提供一些註釋與提供例如setter相同。 – 2009-10-23 18:38:39

+0

這是反射所允許的。對於使用反射來完成特定事情的事物來說,這是一個方便之處......您不用使用反射來編寫所有代碼,而且這樣做會很愚蠢,所以一般來說封裝不會被破壞。 – ColinD 2009-10-23 18:41:32