2013-05-26 23 views
1

我正在試圖從java bean執行對象屬性映射到非bean POJO(沒有setter的第三方庫對象)。觀察源代碼,那裏的對象映射器庫依賴於屬性值集的setters方法。將非bean POJO包裝到Javabean中

我的問題是:是否有一個庫將這種非bean POJO封裝到JavaBean中? (主要爲所有字段生成setter和getter,並使用反射來正確設置非public字段的可訪問性(true)等),這樣我可以將屬性映射到生成的JavaBean中,並且一旦所有字段都填充完畢,我就可以從中提取/轉換底層的非bean POJO?

我決定使用JDTO作爲我選擇的對象映射庫。

在此先感謝!

+0

如果沒有setter,可能是有很好的理由。該類的作者希望該對象是不可變的,並且是線程安全的,或者希望通過不逐一設置屬性來維護一些不變量。您通過反射訪問其私有字段來破解封裝,並在您採用下一個版本的庫時將自己暴露給失敗。 COnsider將狀態複製到其他對象而不是修改合適的封裝對象。 –

回答

1

您可以將不可變類的實例包裝在動態代理(java.lang.reflection.InvocationHandler)中。代理反過來可以使用反射來提供您喜歡的操作。 Apache Beanutils可以在這裏幫助,而Hibernate使用CGLIB來加速這一點。

可能有這樣的用例,例如修復第三方庫中的錯誤,但這很少見。如果是這樣的話,帶有攔截器的aspectj也會有幫助。

所以推薦的方法是將不可變類的實例中的值複製到另一個可變類的實例中,改變那裏的狀態,然後以某種方式「官方」的方式堅持它。這樣做的理由已經在JB Nizet的優秀評論中描述過了,所以他值得讚揚。

1

觀察源代碼,對象映射器庫在那裏依賴於setter方法的 屬性值集。

那麼,這取決於圖書館。如果你的意思是Apache Beanutils,他們是非常保守的,他們需要確切的類型匹配的吸氣和設置,使用isField約定只適用於原始布爾類型等Dozer是限制性較少,但我已與版本(這是關於然而5年前),沒有處理返回設置(對於設置模型)。

我不推薦使用限制性工具,而是建議您分叉和修改現有工具。提到的Apache Beanutils具有許可證,並且Apache代碼通常非常易讀並且易於修改。然後,您可以實現直接從公共領域進行讀取,通過構造函數設置字段,並且如果Java安全設置允許,則直接訪問私有成員(在大多數應用程序服務器上可能不工作,這會將安全標誌設置爲禁止) 。