java中transient關(guān)鍵字用法分析
本文實(shí)例分析了java中transient關(guān)鍵字用法。分享給大家供大家參考。具體分析如下:
java有個(gè)特點(diǎn)就是序列化,簡(jiǎn)單地來(lái)說(shuō)就是可以將這個(gè)類存儲(chǔ)在物理空間(當(dāng)然還是以文件的形式存在),那么當(dāng)你從本地還原這個(gè)文件時(shí),你可以將它轉(zhuǎn)換為它本身。這可以極大地方便網(wǎng)絡(luò)上的一些操作,但同時(shí),因?yàn)樯婕暗桨踩珕?wèn)題,所以并不希望把類里面所有的東西都能存儲(chǔ)(因?yàn)槟菢?,別人可以通過(guò)序列化知道類里面的內(nèi)容),那么我們就可以用上transient這個(gè)關(guān)鍵字,它的意思是臨時(shí)的,即不會(huì)隨類一起序列化到本地,所以當(dāng)還原后,這個(gè)關(guān)鍵字定義的變量也就不再存在。
通常,我們寫的程序都要求特定信息能持久存在或保存到磁盤上,以供一個(gè)程序使用或用在同一個(gè)程序的另一次運(yùn)行上.這種持久性可以通過(guò)幾種方式來(lái)實(shí)現(xiàn),包括寫到數(shù)據(jù)庫(kù)中或是利用JAVA為對(duì)象序列化提供的支持.不管我們選用什么方法,類實(shí)例的持久性都是通過(guò)保存類的域的狀態(tài)來(lái)完成的,保存這些狀態(tài),以便以后可以對(duì)它們進(jìn)行訪問(wèn)或使用它們來(lái)創(chuàng)建相同的實(shí)例.然而,有可能并不是所有的域都需要被保存起來(lái).當(dāng)一個(gè)實(shí)例被持久化時(shí),其內(nèi)部的一些域卻不需要持久化,則可以用trainsient修飾符告訴編譯器指定的域不需要被持久保存.
首先,讓我們看一些Java serialization的代碼:
public class LoggingInfo implements java.io.Serializable { private Date loggingDate = new Date(); private String uid; private transient String pwd; LoggingInfo(String user, String password) { uid = user; pwd = password; } public String toString() { String password=null; if(pwd == null) { password = "NOT SET"; } else { password = pwd; } return "logon info: /n " + "user: " + uid + "/n logging date : " + loggingDate.toString() + "/n password: " + password; } }
現(xiàn)在我們創(chuàng)建一個(gè)這個(gè)類的實(shí)例,并且串行化(serialize)它 ,然后將這個(gè)串行化對(duì)象寫如磁盤。
LoggingInfo logInfo = new LoggingInfo("MIKE", "MECHANICS"); System.out.println(logInfo.toString()); try { ObjectOutputStream o = new ObjectOutputStream( new FileOutputStream("logInfo.out")); o.writeObject(logInfo); o.close(); } catch(Exception e) {//deal with exception} To read the object back, we can write try { ObjectInputStream in =new ObjectInputStream( new FileInputStream("logInfo.out")); LoggingInfo logInfo = (LoggingInfo)in.readObject(); System.out.println(logInfo.toString()); } catch(Exception e) {//deal with exception}
如果我們運(yùn)行這段代碼,我們會(huì)注意到從磁盤中讀回(read——back (de-serializing))的對(duì)象打印password為"NOT SET"。這是當(dāng)我們定義pwd域?yàn)閠ransient時(shí),所期望的正確結(jié)果。
現(xiàn)在,讓我們來(lái)看一下粗心對(duì)待transient域可能引起的潛在問(wèn)題。假設(shè)我們修改了類定義,提供給transient域一個(gè)默認(rèn)值,代碼如下:
public class GuestLoggingInfo implements java.io.Serializable { private Date loggingDate = new Date(); private String uid; private transient String pwd; GuestLoggingInfo() { uid = "guest"; pwd = "guest"; } public String toString() { //same as above } }
現(xiàn)在,如果我們穿行化GuestLoggingInfo的一個(gè)實(shí)例,將它寫入磁盤,并且再將它從磁盤中讀出,我們?nèi)匀豢吹阶x回的對(duì)象打印password 為 "NOT SET"。
當(dāng)從磁盤中讀出某個(gè)類的實(shí)例時(shí),實(shí)際上并不會(huì)執(zhí)行這個(gè)類的構(gòu)造函數(shù),
而是載入了一個(gè)該類對(duì)象的持久化狀態(tài),并將這個(gè)狀態(tài)賦值給該類的另一個(gè)對(duì)象。
希望本文所述對(duì)大家的Java程序設(shè)計(jì)有所幫助。
相關(guān)文章
Java中volatile關(guān)鍵字實(shí)現(xiàn)原理
本文詳細(xì)解讀一下volatile關(guān)鍵字如何保證變量在多線程之間的可見性,對(duì)Java中volatile關(guān)鍵字實(shí)現(xiàn)原理感興趣的朋友一起通過(guò)本文學(xué)習(xí)吧2017-06-06解析iReport自定義行數(shù)分頁(yè)的操作方法
ireport默認(rèn)都是自動(dòng)分頁(yè)數(shù)據(jù)超出頁(yè)面長(zhǎng)度就會(huì)自動(dòng)分到下一頁(yè),但有時(shí)候業(yè)務(wù)需要一頁(yè)只顯示固定幾行這時(shí)候就需要自定義條數(shù)了。下面看具體操作吧2021-10-10使用graalvm為帶有反射功能的java代碼生成native?image的示例詳解
graalvm讓native鏡像支持反射的關(guān)鍵是利用json提前告訴它哪些類的哪些方法會(huì)被反射調(diào)用,然后它就能力在運(yùn)行時(shí)支持反射了,這篇文章主要介紹了如何使用graalvm為帶有反射功能的java代碼生成native?image,需要的朋友可以參考下2024-02-02SpringBoot整合Mybatis之各種查詢、模糊查詢、批量刪除、動(dòng)態(tài)表名操作
這篇文章主要介紹了SpringBoot整合Mybatis之各種查詢、模糊查詢、批量刪除、動(dòng)態(tài)表名,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12使用filter實(shí)現(xiàn)url級(jí)別內(nèi)存緩存示例
這篇文章主要介紹了使用filter實(shí)現(xiàn)url級(jí)別內(nèi)存緩存示例,只需要一個(gè)靜態(tài)類,在filter中調(diào)用,也可以全部寫到filt里面??梢愿鶕?jù)查詢參數(shù)分別緩存,需要的朋友可以參考下2014-03-03使用log4j2自定義配置文件位置和文件名(附log4j2.xml配置實(shí)例)
這篇文章主要介紹了使用log4j2自定義配置文件位置和文件名(附log4j2.xml配置實(shí)例),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Spring?RestTemplate遠(yuǎn)程調(diào)用過(guò)程
這篇文章主要介紹了Spring?RestTemplate遠(yuǎn)程調(diào)用過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11MyEclipse設(shè)置Console輸出到文件的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇MyEclipse設(shè)置Console輸出到文件的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07