没有Java反射的对象深度克隆

时间:2012-11-02 16:31:32

标签: java

在没有Java反射的情况下进行深层对象克隆的可能性有多大?我使用了使用反射的Object克隆库,但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添加了Dozer。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

您是否考虑过使用Dozer

[来自他们的网站]

  

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

     

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

     

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

答案 2 :(得分:0)

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