遍历POJO属性

3
通过反射,我找到了x个POJO类的属性列表,需要显示并创建一个标题列表,以便在这些标题下显示属性(标题是字段上的注释)。
每个属性都有一个getter方法。POJO的形式是:对于我想要显示的每个属性,都有一个getter方法。
以下是详细信息:POJO用@Entity进行了注释,我正在执行一个查询(使用JPA),并获得一个结果集。现在,我想通过调用正确的getter方法来显示结果集(特定POJO的集合)。
我可以调用getter方法。我的问题是,由于没有做过这个...我担心在大型结果集上使用反射可能不是特别高效,也许有一种方法可以使JPA实体对象以一致的方式可迭代。
例如,如果有一种简单的方法可以将每个记录作为可索引的集合返回,那么我就可以按照它们在每个记录中出现的顺序排列我的标题并进行迭代。然后,这将不是一个POJO,但通过封装,在API的某个部分中看起来可能是这样。
寻求建议!它会以一种或另一种方式工作,但我宁愿它看起来漂亮一些。

当对性能有疑问时,进行测量! - meriton
1
我知道这听起来有点过早优化,非常过早,因为甚至还没有一个可行的实现!但更多的是在寻找一个好的方法。 - Quaternion
我不知道这是否是 Stack Overflow 的方式,但对我来说,两个答案都同样有价值,所以我会等待两天,并将采纳的答案授予获得第二高赞数的回答者,并将50个赏金授予获得最高赞数的回答者,让社区帮我解决(esaj 和 Stas 之间的)平局。 - Quaternion
如果您使用的是JPA 2.0,那么您可以利用其中包含的元模型API:https://dev59.com/RVfas4cB2Jgan1znYNkZ#4902069 - bdoughan
3个回答

4

由于您正在使用JPA,是否尝试过JPA 2元模型(javax.persistence.metamodel)。该元模型将从JPA元数据中提供有关JPA实体的信息:

entityManager.getMetamodel().entity(entityClass). getAttributes();

3
使用反射时,如果getter方法仅返回值且不包含任何特殊逻辑,则不需要调用对象中的getter方法,即使字段是私有的(请参见setAccessible)。
至于性能方面,在我们当前的项目中正在做类似的事情,目前还没有遇到任何问题(最坏的情况是处理程序检查对象上的注释字段,并通过反射从中构建JSON数据,遍历深度嵌套的对象树(集合内的集合),每个对象可以包含几个到几十个字段)。

这也非常有用。关于私有字段的读访问。 - Quaternion

1

我认为这不是一个好主意,因为您混淆了逻辑级别和数据存储级别。最好重写toString方法或类似的方法。如果您仍然想要实现您的想法,最简单的方法是通过迭代字段并通过PropertyUtils访问它们的值。


如果只是对实体的注释,那不算逻辑,只是嵌入的元数据...遍历对象并提取和处理数据的逻辑应该在其他地方。 - esaj
我已经很长时间忽视了那个BeanUtils.jar!很高兴看到它正好包含我所需要的东西! - Quaternion
@esaj,我所指的“逻辑层”是指业务逻辑和“视图”逻辑。我认为它应该与JPA分开。 - Stan Kurilin
1
我会在服务层处理这个问题。因为它是一个Web应用,请求进入操作层,在其下使用服务层,而服务层再访问JPA实体。用于向客户端呈现的显示层是JSP。由于POJO的反射逻辑具有通用性,可能会分离到实用类中(不限于某个特定层级)。放心,我保证保持代码整洁。=P - Quaternion
1
@Quaternion,好的。但是我会关注你的项目。 - Stan Kurilin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接