本文實例分析了java中transient關鍵字用法。分享給大家供大家參考。具體分析如下:
java有個特點就是序列化,簡單地來說就是可以將這個類存儲在物理空間(當然還是以文件的形式存在),那么當你從本地還原這個文件時,你可以將它轉換為它本身。這可以極大地方便網絡上的一些操作,但同時,因為涉及到安全問題,所以并不希望把類里面所有的東西都能存儲(因為那樣,別人可以通過序列化知道類里面的內容),那么我們就可以用上transient這個關鍵字,它的意思是臨時的,即不會隨類一起序列化到本地,所以當還原后,這個關鍵字定義的變量也就不再存在。
通常,我們寫的程序都要求特定信息能持久存在或保存到磁盤上,以供一個程序使用或用在同一個程序的另一次運行上.這種持久性可以通過幾種方式來實現,包括寫到數據庫中或是利用JAVA為對象序列化提供的支持.不管我們選用什么方法,類實例的持久性都是通過保存類的域的狀態來完成的,保存這些狀態,以便以后可以對它們進行訪問或使用它們來創建相同的實例.然而,有可能并不是所有的域都需要被保存起來.當一個實例被持久化時,其內部的一些域卻不需要持久化,則可以用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; } }
現在我們創建一個這個類的實例,并且串行化(serialize)它 ,然后將這個串行化對象寫如磁盤。
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}
如果我們運行這段代碼,我們會注意到從磁盤中讀回(read――back (de-serializing))的對象打印password為"NOT SET"。這是當我們定義pwd域為transient時,所期望的正確結果。
現在,讓我們來看一下粗心對待transient域可能引起的潛在問題。假設我們修改了類定義,提供給transient域一個默認值,代碼如下:
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 } }
現在,如果我們穿行化GuestLoggingInfo的一個實例,將它寫入磁盤,并且再將它從磁盤中讀出,我們仍然看到讀回的對象打印password 為 "NOT SET"。
當從磁盤中讀出某個類的實例時,實際上并不會執行這個類的構造函數,
而是載入了一個該類對象的持久化狀態,并將這個狀態賦值給該類的另一個對象。
希望本文所述對大家的Java程序設計有所幫助。
新聞熱點
疑難解答