1

我正在尝试将对象属性从 java bean 映射到非 bean POJO(没有设置器的第三方库对象)。观察源代码,那里的对象映射库依赖于属性值集的 setters 方法。

我的问题是:是否有将此类非 bean POJO 包装到 JavaBean 中的库?(本质上为所有字段生成setter和getter,并使用反射来正确设置非公共字段的setAccessible(true)等),这样我就可以将属性映射到生成的JavaBean中,一旦它的所有字段都被填充,我可以从中提取/转换回底层的非 bean POJO?

我决定使用 JDTO 作为我选择的对象映射库。

提前致谢!

4

2 回答 2

1

您可以将不可变类的实例包装在动态代理 (java.lang.reflection.InvocationHandler) 中。代理反过来可以使用反射来提供您喜欢的操作。Apache Beanutils 在这里可以提供帮助,Hibernate 使用 CGLIB 来加快速度。

可能有这样的用例,例如修复第三方库中的错误,但这种情况很少见。如果是这种情况,aspectj 及其拦截器也可能会有所帮助。

所以推荐的方法是将值从不可变类的实例复制到另一个可变类的实例中,在那里更改状态,然后以某种“官方”方式将其持久化。JB Nizet 的出色评论已经描述了这样做的原因,因此他值得称赞。

于 2013-05-26T08:00:05.477 回答
1

观察源代码,那里的对象映射库依赖于属性值集的 setters 方法。

好吧,这取决于图书馆。如果您的意思是Apache Beanutils,它们非常保守,它们需要 getter 和 setter 的精确类型匹配,isField仅对原始布尔类型使用约定等。Dozer限制较少,但我使用过的版本(这是大约 5 年前,但是),没有处理返回的 settern(对于设置器模型)。

我建议您不要使用限制性工具,而是分叉和修改现有工具。上面提到的 Apache Beanutils 具有允许这样做的许可证,并且 Apache 代码通常非常易读且易于修改。然后,您可以直接从公共字段读取,通过构造函数设置字段,如果 Java 安全设置允许,则直接访问私有成员(它可能不适用于大多数应用程序服务器,它设置了安全标志来禁止它)。

于 2013-05-26T08:17:18.570 回答