zoukankan      html  css  js  c++  java
  • 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();
        }
    }

  • 相关阅读:
    [css3]搜索框focus时变长
    [css3]文字过多以省略号显示
    HTML5表单新增属性
    [JS]getYear()和getFullYear()方法区别
    红包彩带动画效果
    ios下input focus弹出软键盘造成fixed元素位置移位
    旋转效果
    移动端前端开发
    如何加快页面加载速度
    centos7/rhel7下安装redis4.0集群
  • 原文地址:https://www.cnblogs.com/xubiao/p/5422360.html
Copyright © 2011-2022 走看看