V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hqtc
V2EX  ›  Java

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

  •  
  •   hqtc · 2016-08-09 20:48:07 +08:00 · 5661 次点击
    这是一个创建于 3057 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 部分怎么写比较好? 这样写会不会有点蠢?有没有什么库可以做这种事?

    12 条回复    2016-08-22 13:40:19 +08:00
    Troevil
        1
    Troevil  
       2016-08-09 20:51:18 +08:00
    自己写的话 比较蠢,java 原生反射效率很低的, 类库
    参考
    cglib beancopier

    apache beanutils PropertyUtils
    hqtc
        2
    hqtc  
    OP
       2016-08-09 20:52:49 +08:00
    @Troevil THX, 学习一下~
    tobyxdd
        3
    tobyxdd  
       2016-08-09 21:02:02 +08:00
    deep copy? 可以试试序列化以后再反序列化
    yuankui
        4
    yuankui  
       2016-08-10 09:54:23 +08:00   ❤️ 2
    ```
    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
        5
    domty  
       2016-08-10 10:04:58 +08:00
    原生反射限制太多,序列化后反序列化是好主意
    pH
        6
    pH  
       2016-08-10 10:22:59 +08:00
    @Troevil 请问下,类库难道不是通过反射来做么
    hqtc
        7
    hqtc  
    OP
       2016-08-10 10:24:29 +08:00
    @yuankui 好主意!
    Troevil
        8
    Troevil  
       2016-08-10 10:31:33 +08:00
    @pH 其他我不太清楚 就 cglib 而言是通过 动态生成字节码来的 ,类似的 还有 Javassist,Asm
    kost
        9
    kost  
       2016-08-10 18:23:52 +08:00   ❤️ 2
    反射效率再低也比序列化效率高一两个数量级。

    比如测试 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
        10
    Honwhy  
       2016-08-11 09:04:15 +08:00
    @kost 序列化和反序列化要做的事情多好几个数量级的
    zonghua
        11
    zonghua  
       2016-08-14 01:39:20 +08:00 via iPhone
    @domty 因为序列化过程也是用到反射
    breakeryang
        12
    breakeryang  
       2016-08-22 13:40:19 +08:00
    @yuankui 简单直接
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   887 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:18 · PVG 06:18 · LAX 14:18 · JFK 17:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.