在没有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。
答案 0 :(得分:3)
嗯,您可以随时手动进行深度克隆,只需覆盖类中的clone()
方法即可。非常重复的工作,但可行。而且比使用反射更有效。
答案 1 :(得分:3)
您是否考虑过使用Dozer?
[来自他们的网站]
Dozer是Java Bean to Java Bean映射器,它以递归方式复制数据 从一个对象到另一个对象。通常,这些Java Bean将是 不同的复杂类型。
Dozer支持简单属性映射,复杂类型映射, 双向映射,隐式显式映射,以及 递归映射。这包括映射集合属性 还需要在元素级别进行映射。
Dozer不仅支持属性名称之间的映射,还支持 自动在类型之间转换。大多数转换方案都是 支持开箱即用,但Dozer也允许您指定自定义 通过XML进行转换。
答案 2 :(得分:0)
您可以尝试ObjectOutputStream / ObjectInputStream。这使用反射,但您的SecurityManager可能允许它,因为您没有直接调用它。