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

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458789.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458789.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458789.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++異常以及錯誤處理

計算機應用程序中離不開錯誤處理,尤其是生產型大型軟件系統。應用軟件系統運行屬于循環處理事務,出錯后需要保證不能讓軟件程序直接退出。這就需要使用一定的程序容錯處理來應對。一般情況下,大型軟件開發中的軟件系統容錯處理會結合異常處理…

家用臺式計算機的額定功率,臺式機的功率(臺式電腦電源功率多大才合適?)...

臺式機的功率(臺式電腦電源功率多大才合適?)組裝一臺電腦,我們需要先挑選好硬件,搭配硬件最關鍵點就是CPU和主板兼容性,硬件之間的均衡性、電源功率等,均需要考慮周到。那么臺式電腦電源功率多大才合適?下面…

關于angularjs input上傳圖片前獲取圖片的Size 淺析

首先我們需要一個指令來追蹤input的change。ngChage不適用input[file]。 app.directive("fileread", [function () { return { scope: { selectedFile: "", changed: & }, link: function(scope, element, attributes) { element.bind("change&qu…

CountDownLacth詳解

一個同步輔助類,在完成一組正在其他線程中執行的操作之前,它允許一個或多個線程一直等待。 用給定的計數 初始化 CounDownLatch。由于調用了countDown() 方法,所以在當前計數到達零之前,await()方法會一直受阻塞。之后,會釋放所有…

怎么用計算機畫正弦函數圖像,幾何畫板如何繪制正弦函數圖象

考慮到三角函數問題描點的實際困難,教材表述時借助正弦線利用幾何法利用三角函數線作正弦函數圖象,但由此帶來的困難是如何實現這種效果。如果能讓三角函數線動起來,那將會更加直觀易懂。幾何畫板作為使用專業的幾何繪圖軟件,自帶…

C/C++常見指針錯誤 and 內存訪問越界

1) 內存分配未成功,卻使用了它。 編程新手常犯這種錯誤,因為他們沒有意識到內存分配會不成功。常用解決辦法是,在使用內存之前檢查指針是否為NULL。如果指針p是函數的參數,那么在函數的入口處用assert(p!NULL)進行檢查。如果是用m…

C#將dll打包到程序中

直接進入主題 先來看一個栗子,假設現在有一個第三方dll namespace TestLibrary1 {public class Test{public void Point(){Console.WriteLine("aaabbbccc");}} } TestLibrary1.dll在項目中引用,然后調用其中的方法Test,將輸出aaabbbccc using System;namespace Conso…

Exchange 2016集成ADRMS系列-12:域內outlook 2010客戶端測試

接下來,我們來到域內安裝了office 2010的機器上進行測試。 首先我們在客戶端上強制刷新組策略,把我們剛才設置的策略刷新下來。 然后我們可以運行gpresult /h result.html來看看策略是不是已經下來了。 策略下來之后,我們打開客戶端上面的out…

如何用css和HTML結合畫熊,結合偽元素實現的純CSS3高級圖形繪制

自小編上次整理了一些基礎圖形的繪制方法之后,大家都紛紛表示對css3的繪圖技巧學習很有幫助。雖說萬變不離其宗,再復雜的圖形也可以用最簡單的三角形或者圓弧組合出來,但仍有不少朋友反映,學會基本圖形也不懂得怎樣組合&#xff0…

基于C++中常見內存錯誤的總結

在系統開發過程中出現的bug相對而言是比較好解決的,花費在這個上面的調試代價不是很大,但是在系統集成后的bug往往是難以定位的bug(最好方式是打樁,通過打樁可以初步鎖定出錯的位置,如:進入函數前打印日志&…

UWP開發細節記錄:判斷文件類型

StorageFile.ContentType 屬性,是 string 類型,用來表示文件內容的 MIME 類型。例如,音樂文件可能有 "audio/mpeg" MIME 類型。(MSDN) MIME 類型的定義可以下面的鏈接找到: MIME Types - http://blogs.msdn.com/b/jaime…

Creating Apps With Material Design —— Creating Lists and Cards

轉載請注明 http://blog.csdn.net/eclipsexys 翻譯自Developer Android。時間倉促,有翻譯問題請留言指出,謝謝創建Lisst和Cards在你的應用程序創建復雜的清單,并與材料設計風格卡。您能夠使用RecyclerView和CardView部件。 創建RecyclerView …

計算機考研自命題院校雙非,計算機考研408——951211院校匯總

眾所周知,計算機考研408計算機學科基礎綜合難度與一些頂尖985自命題相比也是不落下風的,號稱最難工科專業課(請忽略912這種殿堂級別的),難度大、知識點龐雜也是前些年眾多高校紛紛脫離408統考的原因。19年的計算機類考研火到爆炸,…

Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)

第一次鼓搗Docker,- - ! 報錯: serverubuntu1987:~$ sudo apt-get update E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable) E: Unable to lock directory /var/lib/apt/lists/ 轉載于:https://www.cnblo…

新手學Struts(一)----JSP+Servlet講解MVC實現原理

MVC基本原理一個簡單的例子改良的例子Struts基本流程的實現最近在學SSH(Struts HibernateSpring),這也算是一個比較經典的框架了,之前都是看人家大牛說這個框架,那個框架,說的真溜,自己也是佩服的五體投地啊…

中國首臺千萬億次超級計算機,中國首臺千萬億次超級計算機首批設備開始試用...

新華社天津1月13日電(記者 周潤健 羅捷)記者13日從國家超級計算天津中心獲悉,中國首臺千萬億次超級計算機“天河一號”首批設備調試工作結束,具備向客戶提供服務的條件,“天河一號”…

Outlook Express 錯誤代碼表

錯誤碼 意義 一般 0x800C01310x800C013E 可能是 Folders.dbx 檔案屬性錯誤或損壞. 0x800CCC00 身份驗證(Authentication)未載入 0x800CCC01 認證(Certificate)內容錯誤 0x800CCC02 認證日期錯誤 0x800CCC03 使用者已聯機 0x800CCC…

USB設備枚舉過程

(1)集線器檢測新設備 (集線器的英文稱為“Hub”)主機集線器監視著每個端口的信號電壓,當有新設備接入時便可覺察。(集線器端口的兩根信號線的每一根都有15kΩ的下拉電阻,而每一個設備在D都有一個…

windows下apache+php+mysql 環境配置方法

轉自:http://www.jb51.net/article/30128.htm 一 準備 1 下載apache http://httpd.apache.org/download.cgi#apache24 httpd-2.2.22-win32-x86-openssl-0.9.8t.msiopenssl表示帶有openssl模塊,利用openssl可給Apache配置SSL安全鏈接 2 下載php http://wi…

計算機工作原理 公開課,《計算機的基本工作原理》公開課材料(11頁)-原創力文檔...

《計算機系統的組成》教學設計教師:吳軍一、學習者分析初一的學生,具有活潑好動的特點,懷著對初中生活的憧憬來到一個新的環境里,對每樣事物都充滿著好奇,都想去探個究竟。隨著社會的進步, 計算機的使用范圍…