我正在尝试将对象属性映射从java bean映射到非bean POJO(没有setter的第三方库对象)。观察源代码,对象映射器库依赖于属性值集的setter方法。
我的问题是:是否有一个库将这样的非bean POJO包装到JavaBean中? (基本上为所有字段生成setter和getter,并使用反射来正确设置非公共字段的可访问(true)等),这样我就可以将属性映射到生成的JavaBean中。一旦填充了所有字段,我就可以提取/转换基础的非bean POJO吗?
我决定使用JDTO作为我选择的对象映射库。
提前致谢!
答案 0 :(得分:1)
您可以在动态代理(java.lang.reflection.InvocationHandler)中包装不可变类的实例。代理反过来可以使用反射来提供您喜欢的操作。 Apache Beanutils可以在这里提供帮助,而Hibernate使用CGLIB加速这一过程。
可能有一个用例就像在第三方库中修复错误一样,但这种情况很少见。如果是这种情况,带有拦截器的aspectj也可能会有所帮助。
所以推荐的方法是将值从不可变类的实例复制到另一个可变类的实例中,在那里更改状态,然后以某种方式“以官方”的方式保留它。这样做的原因已在JB Nizet的优秀评论中有所描述,因此他值得赞扬。
答案 1 :(得分:1)
观察源代码,对象mappers库依赖于它 关于属性值集的setter方法。
嗯,这取决于图书馆。如果您指的是 Apache Beanutils ,它们非常保守,它们需要针对getter和setter的精确类型匹配,仅使用isField
约定用于原始布尔类型等。Dozer限制较少,但我使用过的版本(大约5年前,但是),没有处理返回的settern(对于链 setter模型)。
我建议您分叉修改现有工具,而不是使用限制性工具。提到的Apache Beanutils具有允许的许可,并且Apache代码通常具有可读性且易于修改。然后,您可以直接从公共字段实现读取,通过构造函数设置字段,如果Java安全设置允许,则直接访问私有成员(在大多数应用程序服务器上可能不能正常工作,这会设置安全性标志禁止)。