2016-10-24 46 views
0

我設計一個Hibernate的實體的更新前的事件監聽器與Java狀態和參數名稱。此類將參數名稱映射到相應的一對舊狀態和新狀態,並進行延遲評估布爾型hasChanged並通過公共方法查詢通過鍵(其類型爲字符串)的地圖。Retrive私有類成員的名字

問題是:我需要從實體一個如果特定屬性來檢查,說,這是一個名爲VAR,都會有它的狀態被更新事件改變。當然,這是可以做到這樣的:

void foo(PreUpdateEvent event) { 
    StateTracker stateTracker(event); 
    if(stateTracker.isPropertyModified("var") { 
     /* do stuff... */ 
    } 
} 

我知道我不能總是拯救世界,但如果有人發生了改變,變種災難一個,那麼上面的代碼將被打破,因爲重構工具,甚至更聰明也不會看到字符串「變種」是指代表參數的名稱VAR(現災難)。

我接受這種情況沒有更好的辦法,但我想確保通過反射或其他方式無法獲得變量名稱。

理想的情況下,這將這樣的工作:

void foo(PreUpdateEvent event) { 
    StateTracker stateTracker(event); 
    if(stateTracker.isPropertyModified(A.class.var.getName()) { // Magic! 
     /* do stuff... */ 
    } 
} 

也許在註釋處理領域的一些魔法可以進行這樣的魔法......

+1

最好的辦法是有一個單元測試,確保字段名稱使用是正確的。 –

+0

@PeterGelderbloem偉大的建議,我將與單元測試 –

回答

0

是經過簡單的反射,通過標籤進行迭代,創建哈希集鍵是字段名稱,值是字段的值,然後每次迭代通過您的設置,如果任何項目狀態更改/刪除標誌實體更新

+0

或取而代之的價值,你可以使用一個生成的哈希值將更少的內存消耗 – HRgiger

+0

對不起,但我不明白這是如何解決這個問題。我不想將實體標記爲已更新,我想根據正在更新的特定字段篩選出實體的相關更新。創建哈希集不會放棄某人修改字段名稱並渲染使用StateTracker中舊名稱的代碼損壞的風險。 –