2016-10-24 45 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中旧名称的代码损坏的风险。 –