• java中定义一个CloneUtil 工具类


    其实所有的java对象都可以具备克隆能力,只是因为在基础类Object中被设定成了一个保留方法(protected),要想真正拥有克隆的能力,

    就需要实现Cloneable接口,重写clone方法。通过克隆方法得到的对象是一个本地的副本。

    1、实现Cloneable接口

    具体看代码:

    class User implements Cloneable{

      int age;

      public User(int age){

        //用this关键字不至于类成员变量与形参混淆

        this.age=age;

      }

      //这里可加@Override也可不加,加了会自动提示是否正确

      @Override

      public Object clone{

        Object o=null;

        try{

          o=super.clone();

        }catch(CloneNotSupportedException e){

          e.printStackTrace();

        }

      }

      public String toString(){

        return Integer.toString(this.age);

      }

    }

    2、自己手动写一个CloneUtil 工具类,不是实现Cloneable这种方式,但是能达到效果。

    package cn.com.util;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;

    /**
     * 对象clone 工具类
     * @author
     *
     */
    public class CloneUtil {
        public static Object clone(Serializable obj) {
            Object clone = cloneObject(obj);
            if (clone == null) {
                clone = cloneObject(obj);
            }
            return clone;
        }

        public static Object cloneObject(Serializable obj) {
            Object anotherObj = null;

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = null;

            ObjectInputStream ois = null;
            try {
                oos = new ObjectOutputStream(baos);
                oos.writeObject(obj);
                byte[] bytes = baos.toByteArray();

                ByteArrayInputStream bais = new ByteArrayInputStream(bytes);

                ois = new ObjectInputStream(bais);
                anotherObj = ois.readObject();
            } catch (IOException ex) {
                throw new RuntimeException(ex.getMessage(), ex);
            } catch (ClassNotFoundException ex) {
                throw new RuntimeException(ex.getMessage(), ex);
            } catch (StackOverflowError error) {
                System.out.println("stack length " + error.getStackTrace().length);
                error.printStackTrace();
                return null;
            } finally {
                if (oos != null)
                    try {
                        oos.close();
                    } catch (IOException localIOException3) {
                    }
                if (ois != null)
                    try {
                        ois.close();
                    } catch (IOException localIOException4) {
                    }
            }
            return anotherObj;
        }

        public static int getObjectSize(Serializable obj) {
            ByteArrayOutputStream bs = new ByteArrayOutputStream();
            try {
                ObjectOutputStream os = new ObjectOutputStream(bs);
                os.writeObject(obj);
                os.flush();
            } catch (Exception e) {
                throw new RuntimeException(e.getMessage(), e);
            }
            return bs.size();
        }
    }

  • 相关阅读:
    借阅的列表
    列表中的方法
    对编程本质的认识
    列表技能
    链表策略
    在pycharm里添加解释器路径
    数据类型转化
    罗列内存中的数字
    【python3的学习之路十】模块
    【python3的学习之路九】函数式编程
  • 原文地址:https://www.cnblogs.com/xubiao/p/5422360.html
Copyright © 2020-2023  润新知