如何使用反射从JPA对象中检索私有变量属性

时间:2012-08-03 23:34:55

标签: java jpa reflection

我的目标之一是创建一个引擎,该引擎将使用反射动态地从JPA对象设置pojo对象中的值。其中一个匹配标准是,字段名称应匹配。

我成功地为两个pojo对象实现了这个功能。但是当我尝试使用JPA对象作为对象参数之一时,它不起作用。根据我的研究,我发现方法Class.getDeclaredFields()并没有给我字段的名称,而是JPA对象的成员变量的getter / setter方法名称。

任何人都可以给我一个指导或方向,我应该在哪里/应该完成这项任务?

2 个答案:

答案 0 :(得分:2)

JPA提供程序通常会使用具体JPA类的dynamic proxy classes,因此您无法保证代理中的字段名称。关于代理的唯一保证是方法是相同的。使用调试器检查您尝试使用的JPA类实例的运行时类,您将看到问题。

您可以做的最好的事情是使用反射来调用JPA返回的对象上的方法。


除此之外,我真的不明白为什么你需要POJO-ify实体类,因为实体主要是注释的...... POJO。

答案 1 :(得分:0)

  

其中一个匹配条件是,字段名称应匹配。

我认为这是你问题的根源。无法保证Java对象的字段名称将与getter和setter的名称相匹配......或其他任何内容。如果你做出这个假设,你将遇到无效的情况。

最好的解决方案是不使用这种方法。要求Pojo类符合JavaBeans规范并依赖setter来设置属性。这可能比对(私人)字段名称做出更多的假设。


事实上,使用动态代理实现的通用JPA对象的状态很可能保存在哈希映射中。你可以看到的那些字段可能只是用于其他东西的常量。