最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的transient關(guān)鍵字解析

 更新時間:2023年09月28日 09:12:58   作者:光與熱  
這篇文章主要介紹了Java中的 transient關(guān)鍵字解析,有時候我們的一些敏感信息比如密碼并不想序列化傳輸給對方,這個時候transient關(guān)鍵字就派上用場了,如果一個類的變量加上了transient關(guān)鍵字那么這個字段就不會被序列化,需要的朋友可以參考下

transient關(guān)鍵字

java對象在實現(xiàn)了Serilizable接口后這個對象就可以被序列化,但是java的這種序列化機制會將這個類的所有屬性和方法都序列化.有時候我們的一些敏感信息比如密碼并不想序列化傳輸給對方,這個時候transient關(guān)鍵字就派上用場了,如果一個類的變量加上了transient關(guān)鍵字那么這個字段就不會被序列化

下面這個例子我們利用transient避免User序列化過程中密碼字段的序列化

@Data
@ToString
@AllArgsConstructor
public class User implements Serializable {
    private String username;
    private transient String password;
}

我們首先創(chuàng)建一個對象User,利用ObjectOutputStream序列化到本地文件,利用ObjectInputStream讀取并反序列化為User對象

try (ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("user.txt"));
     ObjectInputStream is = new ObjectInputStream(new FileInputStream("user.txt"));) {
    User user = new User("jack", "123456");
    System.out.println(user);
    os.writeObject(user);
    os.flush();
    user = (User) is.readObject();
    System.out.println(user);
} catch (IOException e) {
    e.printStackTrace();
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

運行結(jié)果如下

User{username='jack', password='123456'}
User{username='jack', password='null'}

可以看到密碼字段為空

從上面這個例子可以看到一旦變量被transient關(guān)鍵字修飾,該變量就不參與持久化過程,再進一步深入學(xué)習(xí)transient

1. transient關(guān)鍵字只能修飾變量,不能修飾方法和類.如果變量類型是我們自定義的類,那么這個類需要實現(xiàn)Serializable接口

2. 靜態(tài)變量無論是否被transient關(guān)鍵字修飾都不參與序列化

接下來我們詳細(xì)講解下上述的第二點 我們給User添加一個字段Country,這是一個靜態(tài)字段

我們重試上面的過程

try (ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("user.txt"));
     ObjectInputStream is = new ObjectInputStream(new FileInputStream("user.txt"));) {
    User user = new User("jack", "123456");
    User.setCountry("China");
    System.out.println(user);
    os.writeObject(user);
    os.flush();
    user = (User) is.readObject();
    System.out.println(user);
} catch (IOException e) {
    e.printStackTrace();
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

與第一個例子不同點在于我們在利用setter設(shè)置Country

運行結(jié)果

User{username='jack', password='123456', country='China'}
User{username='jack', password='null', country='China'}

我們發(fā)現(xiàn)country好像被序列化了,但是靜態(tài)變量無論如何都不參與初始化的,我們猜想country中的值是jvm中的而不是反序列化出來的 我們利用下面這個例子驗證我們的猜想

try (ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("user.txt"));
     ObjectInputStream is = new ObjectInputStream(new FileInputStream("user.txt"));) {
    User user = new User("jack", "123456");
    User.setCountry("China");
    System.out.println(user);
    os.writeObject(user);
    os.flush();
    User.setCountry("American");
    user = (User) is.readObject();
    System.out.println(user);
} catch (IOException e) {
    e.printStackTrace();
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

對象序列化寫入文件后我們再修改User的country字段為American

結(jié)果如下

User{username='jack', password='123456', country='China'}
User{username='jack', password='null', country='American'}

可以看到country果然變成了American我們的猜想成立,也就是說反序列化后static型變量的值為JVM中的值

還有一點關(guān)于transient關(guān)鍵字失靈的情況需要注意,看下面這個例子

@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Student implements Externalizable {
    private transient String username;
    private transient int age;
    private transient String fatherName;
    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(username);
        out.writeInt(age);
        out.writeObject(fatherName);
    }
    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        username = (String) in.readObject();
        age = in.readInt();
        fatherName= (String) in.readObject();
    }
}

student學(xué)生類實現(xiàn)了Externalizable接口作用我們下面再講,student的所有屬性都使用transient關(guān)鍵字修飾

測試代碼如下

try (ObjectInput in = new ObjectInputStream(new FileInputStream(new File("student.txt")));
     ObjectOutput out = new ObjectOutputStream(new FileOutputStream(new File("student.txt")));) {
    Student student = new Student("student", 20, "father");
    System.out.println(student);
    out.writeObject(student);
    out.flush();
    student = (Student) in.readObject();
    System.out.println(student);
} catch (Exception e) {
    e.printStackTrace();
}

運行結(jié)果如下所示

Student(username=student, age=20, fatherName=father)
Student(username=student, age=20, fatherName=father)

可以看到盡管transient關(guān)鍵字修飾了所有屬性,按理這些屬性都不應(yīng)該被序列化,這是為什么呢,這要談到j(luò)ava的序列化機制了,java自帶的對象的序列化可以通過兩種方法實現(xiàn),一種就是Serializable,另外一種就是上面的Externalizable,利用External自定義java序列化方式,選擇序列化哪些屬性都與transient關(guān)鍵字無關(guān)了

到此這篇關(guān)于Java中的transient關(guān)鍵字解析的文章就介紹到這了,更多相關(guān)Java中的 transient內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring使用Filter過濾器對Response返回值進行修改的方法

    spring使用Filter過濾器對Response返回值進行修改的方法

    這篇文章主要介紹了spring使用Filter過濾器對Response返回值進行修改,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • 淺談Spring Bean的基本配置

    淺談Spring Bean的基本配置

    這篇文章主要介紹了淺談Spring Bean的基本配置,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java Spring的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • mybatis中實現(xiàn)讓返回值與bean中字段相匹配

    mybatis中實現(xiàn)讓返回值與bean中字段相匹配

    這篇文章主要介紹了mybatis中實現(xiàn)讓返回值與bean中字段相匹配,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Spring實現(xiàn)對象注入的三種方法詳解

    Spring實現(xiàn)對象注入的三種方法詳解

    這篇文章主要為大家學(xué)習(xí)介紹了Spring中實現(xiàn)對象注入的三種常用方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的可以了解一下
    2023-07-07
  • 一文帶你快速學(xué)會JDBC及獲取連接的五種方式

    一文帶你快速學(xué)會JDBC及獲取連接的五種方式

    JDBC(Java Database Connectivity)是一個獨立于特定數(shù)據(jù)庫管理系統(tǒng)、通用的SQL數(shù)據(jù)庫存取和操作的公共接口,下面這篇文章主要給大家介紹了關(guān)于如何通過一文帶你快速學(xué)會JDBC及獲取連接的五種方式,需要的朋友可以參考下
    2022-09-09
  • 深入探討Spring Statemachine在Spring中實現(xiàn)狀態(tài)機的過程

    深入探討Spring Statemachine在Spring中實現(xiàn)狀態(tài)機的過程

    本文深入探討了Spring Statemachine的核心概念、功能及應(yīng)用,包括狀態(tài)和轉(zhuǎn)換的結(jié)構(gòu)化定義、事件驅(qū)動的狀態(tài)變遷、持久化支持以及集成Spring生態(tài)系統(tǒng),通過實例分析,展示了其在多個領(lǐng)域的實際應(yīng)用,并討論了如何自定義擴展以滿足特定需求,感興趣的朋友一起看看吧
    2025-04-04
  • Java如何打印完整的堆棧信息

    Java如何打印完整的堆棧信息

    這篇文章主要為大家介紹了Java如何打印完整的堆棧信息示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • 深度源碼解析Java 線程池的實現(xiàn)原理

    深度源碼解析Java 線程池的實現(xiàn)原理

    如何高效的使用這些資源就是程序員在平時寫代碼時候的一個努力的方向。本文要說的線程池就是一種對 CPU 利用的優(yōu)化手段。對Java 線程池的實現(xiàn)原理相關(guān)知識感興趣的朋友一起看看吧
    2021-05-05
  • java 實現(xiàn)切割文件和合并文件的功能

    java 實現(xiàn)切割文件和合并文件的功能

    這篇文章主要介紹了java 實現(xiàn)切割文件和合并文件的功能的相關(guān)資料,這里實現(xiàn)文件的切割的實現(xiàn)代碼和文件合并的實現(xiàn)代碼,需要的朋友可以參考下
    2017-07-07
  • SpringBoot搭配AOP實現(xiàn)自定義注解

    SpringBoot搭配AOP實現(xiàn)自定義注解

    這篇文章主要為大家詳細(xì)介紹了SpringBoot如何搭配AOP實現(xiàn)自定義注解,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-12-12

最新評論

额尔古纳市| 易门县| 青田县| 资溪县| 磐石市| 武宣县| 汝阳县| 台北市| 广汉市| 建湖县| 渝北区| 大埔区| 建德市| 雷州市| 且末县| 遂川县| 昔阳县| 宜宾市| 吐鲁番市| 内江市| 盘山县| 洛阳市| 雷州市| 潮州市| 合川市| 教育| 馆陶县| 沙湾县| 商洛市| 合川市| 尉氏县| 常州市| 本溪市| 吉木萨尔县| 雷波县| 涪陵区| 宝清县| 麻江县| 托克逊县| 遂溪县| 新绛县|