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();
        }
    }

  • 相关阅读:
    mysql命令集锦
    linux 删除文件名带括号的文件
    linux下的cron定时任务
    struts2文件下载的实现
    贴一贴自己写的文件监控代码python
    Service Unavailable on IIS6 Win2003 x64
    'style.cssText' is null or not an object
    "the current fsmo could not be contacted" when change rid role
    远程激活程序
    新浪图片病毒
  • 原文地址:https://www.cnblogs.com/xubiao/p/5422360.html
Copyright © 2011-2022 走看看