2

在没有 Java 反射的情况下进行深度对象克隆的可能性是什么?我使用了使用反射的对象克隆库,但 AppEngine 不允许这样做。

所以我现有的与 Tomcat 一起工作的应用程序不起作用。

更新:

推土机库似乎是最好的选择:

Mapper mapper = new DozerBeanMapper();
DestinationObject destObject =  mapper.map(sourceObject, DestinationObject.class);

问题是,如果我不需要自定义映射,我可以按原样执行上述操作吗?

例如:

Cat cat = new Cat();

Mapper mapper = new DozerBeanMapper();
Cat newCat =  mapper.map(cat, Cat.class);

更新:

当我使用 Dozer 运行我的应用程序时,出现此错误:

Caused by: java.lang.NoSuchMethodError: org.apache.commons.lang.StringUtils.contains(Ljava/lang/String;Ljava/lang/String;)Z
    at org.dozer.util.ResourceLoader.getResource(ResourceLoader.java:53)
    at org.dozer.util.DefaultClassLoader.loadResource(DefaultClassLoader.java:44)
    at org.dozer.config.GlobalSettings.loadGlobalSettings(GlobalSettings.java:116)
    at org.dozer.config.GlobalSettings.<init>(GlobalSettings.java:67)
    at org.dozer.config.GlobalSettings.<clinit>(GlobalSettings.java:46)

看起来我错过了一些东西,虽然我使用 Maven 添加了推土机。

4

3 回答 3

3

好吧,您总是可以手动进行深度克隆,只需覆盖clone()类中的方法。非常重复的工作,但可行。而且也比使用反射更有效。

于 2012-11-02T16:33:29.033 回答
3

您是否考虑过使用推土机

[来自他们的网站]

Dozer 是一个 Java Bean 到 Java Bean 的映射器,它递归地将数据从一个对象复制到另一个对象。通常,这些 Java Bean 将具有不同的复杂类型。

Dozer 支持简单属性映射、复杂类型映射、双向映射、隐式-显式映射以及递归映射。这包括映射集合属性,这些属性也需要在元素级别进行映射。

Dozer 不仅支持属性名称之间的映射,还支持类型之间的自动转换。大多数转换方案都支持开箱即用,但 Dozer 还允许您通过 XML 指定自定义转换。

于 2012-11-02T16:37:25.140 回答
0

你可以试试 ObjectOutputStream/ObjectInputStream。这使用反射,但您的 SecurityManager 可能允许它,因为您没有直接调用它。

于 2012-11-02T16:34:46.233 回答