写点什么

Java 中 tranisent 关键字到底是干嘛用的?

作者:郑在暴富中
  • 2023-11-16
    北京
  • 本文字数:1682 字

    阅读完需:约 6 分钟

最近在看 JUC 的源码过程中,发现 AQS 中的部分字段是用 transient 字段修饰的,搞不明白为什么要这么做,搜集了一些资料后做下整理。

一、介绍

在 Java 编程中,transient 是一个关键字,通常用于修饰变量,它的主要作用是用于指示 JVM 在对象序列化时忽略指定变量,从而避免数据泄露的安全问题。本文将详细介绍 transient 的特性、原理、使用场景和注意事项,帮助读者深入理解 transient 的作用和实现。

二、特性

transient 是一个关键字,它主要用于指示 JVM 在对象序列化过程中,忽略序列化该变量,即不将该变量写入到序列化流中。通过使用 transient,可以避免对临时变量和敏感数据的序列化,并提高序列化性能。

三、原理

在 Java 语言中,对象的序列化和反序列化是通过实现 Serializable 接口和 Externalizable 接口来完成的。在序列化对象时,JVM 会将对象转换为二进制流,并将其写入文件或网络流中。如果对象中某个字段被 transient 修饰,JVM 将忽略该字段的序列化。在反序列化对象时,JVM 会将二进制流转换回对象,并自动为 Transient 字段分配默认值。

四、使用场景

transient 通常用于指定一些临时变量或敏感数据,不希望在序列化时被记录下来。例如,密码、会话令牌或加密密钥等信息就应该被声明为 transient 字段。另外,如果某些字段不需要在序列化后传递给其他系统,也可以使用 transient 来避免序列化。

五、注意事项

  1. 声明为 transient 的字段,不会被存储在序列化的二进制流中。因此,还原后变量值将会丢失,并且该字段默认会变成 null 值。

  2. 当 transient 修饰的变量被 static 修饰时,transient 将不再生效。

  3. 如果在实现 Serializable 接口时,有 transient 关键字实例化的变量,则在反序列化时,该变量将使用默认值初始化,即零值(0、null、false)

六、实际场景

代码

 class User implements Serializable {     private String name;     // 使用transient关键字修饰 敏感字段 密码     private transient String password;      public User(String name, String password) {         this.name = name;         this.password = password;     }      public String getName() {         return name;     }      public String getPassword() {         return password;     } }
复制代码


 public class TestTransient {     public static void main(String[] args) throws IOException, ClassNotFoundException {         User tom = new User("Tom", "123456");         System.out.println("用户名:" + tom.getName() + ", 密码:" + tom.getPassword());          // 序列化对象         Path path = Paths.get("user.obj");          ObjectOutputStream out = new ObjectOutputStream(Files.newOutputStream(path));         out.writeObject(tom);         out.close();          // 反序列化对象         ObjectInputStream in = new ObjectInputStream(Files.newInputStream(path));         User newUser = (User) in.readObject();         in.close();          System.out.println("用户名:" + newUser.getName() + ", 密码:" + newUser.getPassword());      } }
复制代码

打印结果

 用户名:Tom, 密码:123456 用户名:Tom, 密码:null
复制代码


执行以上程序,看到以上结果,可以看出在 User 类中,由于 password 属性被声明为 transient 字段,因此在序列化后,该字段不会被写入到文件中,反序列化时,密码字段被赋值为 null。因此,在打印 newUser 对象时,密码字段的值被输出为 null。这说明了 transient 字段在对象序列化和反序列化时的作用。

除此之外,在实际应用中,我们可以根据需要,灵活使用 transient 关键字,以确保序列化对象的安全性和性能。尤其对于包含敏感数据的对象,使用 transient 可以避免敏感数据被序列化到磁盘中,从而保障数据的保密性。


由此可见,transient 关键字在 Java 编程中扮演着重要的角色,使用 transient 关键字可以有效地进行对象序列化和反序列化,优化程序性能,增加数据安全性


发布于: 刚刚阅读数: 5
用户头像

还未添加个人签名 2022-07-14 加入

还未添加个人简介

评论

发布
暂无评论
Java中tranisent关键字到底是干嘛用的?_Java_郑在暴富中_InfoQ写作社区