Java 如何通过反射实现一个 任意类型 对象的 深拷贝( clone) 功能 ?

2016-08-09 20:48:07 +08:00
 hqtc

RT, 方法需求大概如下:

public class CloneUtil<T> {
	public T clone(T t) throws IllegalAccessException, InstantiationException {
		Class clazz = t.getClass();
		T t2 = (T) clazz.newInstance();
		// TODO: 2016/8/9 deep clone 
		return t2;
	}
}

代码里 todo 部分怎么写比较好? 这样写会不会有点蠢?有没有什么库可以做这种事?

5452 次点击
所在节点    Java
12 条回复
Troevil
2016-08-09 20:51:18 +08:00
自己写的话 比较蠢,java 原生反射效率很低的, 类库
参考
cglib beancopier

apache beanutils PropertyUtils
hqtc
2016-08-09 20:52:49 +08:00
@Troevil THX, 学习一下~
tobyxdd
2016-08-09 21:02:02 +08:00
deep copy? 可以试试序列化以后再反序列化
yuankui
2016-08-10 09:54:23 +08:00
```
public static<T> T convert(Object src, Class<T> clazz) {
String json =JSON.toJSONString(src);
T object = JSON.parseObject(json, clazz);
return object;
}
```
我比较懒,直接用了 FASTJSON 。。。
domty
2016-08-10 10:04:58 +08:00
原生反射限制太多,序列化后反序列化是好主意
pH
2016-08-10 10:22:59 +08:00
@Troevil 请问下,类库难道不是通过反射来做么
hqtc
2016-08-10 10:24:29 +08:00
@yuankui 好主意!
Troevil
2016-08-10 10:31:33 +08:00
@pH 其他我不太清楚 就 cglib 而言是通过 动态生成字节码来的 ,类似的 还有 Javassist,Asm
kost
2016-08-10 18:23:52 +08:00
反射效率再低也比序列化效率高一两个数量级。

比如测试 100 次:
Serialization: 12,941 milliseconds
Reflection : 139 milliseconds

参考资料:
http://www.matthicks.com/2008/05/fastest-deep-cloning.html
http://javatechniques.com/blog/faster-deep-copies-of-java-objects/
Honwhy
2016-08-11 09:04:15 +08:00
@kost 序列化和反序列化要做的事情多好几个数量级的
zonghua
2016-08-14 01:39:20 +08:00
@domty 因为序列化过程也是用到反射
breakeryang
2016-08-22 13:40:19 +08:00
@yuankui 简单直接

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/298223

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX