国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java中transient關鍵字用法分析

2019-11-26 15:18:05
字體:
來源:轉載
供稿:網友

本文實例分析了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程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 成武县| 彭水| 旬邑县| 如东县| 瑞金市| 泰兴市| 临海市| 勃利县| 青冈县| 石狮市| 根河市| 东安县| 平利县| 铅山县| 岱山县| 鄂托克旗| 虞城县| 萝北县| 白城市| 昭通市| 昌都县| 枝江市| 无极县| 定州市| 凌源市| 建平县| 汕头市| 灌南县| 纳雍县| 宜章县| 神池县| 昭通市| 文安县| 灵宝市| 正蓝旗| 磴口县| 镇巴县| 胶南市| 安平县| 荣成市| 德令哈市|