Java 中 tranisent 关键字到底是干嘛用的?
最近在看 JUC 的源码过程中,发现 AQS 中的部分字段是用 transient 字段修饰的,搞不明白为什么要这么做,搜集了一些资料后做下整理。
一、介绍
在 Java 编程中,transient 是一个关键字,通常用于修饰变量,它的主要作用是用于指示 JVM 在对象序列化时忽略指定变量,从而避免数据泄露的安全问题。本文将详细介绍 transient 的特性、原理、使用场景和注意事项,帮助读者深入理解 transient 的作用和实现。
二、特性
transient 是一个关键字,它主要用于指示 JVM 在对象序列化过程中,忽略序列化该变量,即不将该变量写入到序列化流中。通过使用 transient,可以避免对临时变量和敏感数据的序列化,并提高序列化性能。
三、原理
在 Java 语言中,对象的序列化和反序列化是通过实现 Serializable 接口和 Externalizable 接口来完成的。在序列化对象时,JVM 会将对象转换为二进制流,并将其写入文件或网络流中。如果对象中某个字段被 transient 修饰,JVM 将忽略该字段的序列化。在反序列化对象时,JVM 会将二进制流转换回对象,并自动为 Transient 字段分配默认值。
四、使用场景
transient 通常用于指定一些临时变量或敏感数据,不希望在序列化时被记录下来。例如,密码、会话令牌或加密密钥等信息就应该被声明为 transient 字段。另外,如果某些字段不需要在序列化后传递给其他系统,也可以使用 transient 来避免序列化。
五、注意事项
声明为 transient 的字段,不会被存储在序列化的二进制流中。因此,还原后变量值将会丢失,并且该字段默认会变成 null 值。
当 transient 修饰的变量被 static 修饰时,transient 将不再生效。
如果在实现 Serializable 接口时,有 transient 关键字实例化的变量,则在反序列化时,该变量将使用默认值初始化,即零值(0、null、false)
六、实际场景
代码
打印结果
执行以上程序,看到以上结果,可以看出在 User 类中,由于 password 属性被声明为 transient 字段,因此在序列化后,该字段不会被写入到文件中,反序列化时,密码字段被赋值为 null。因此,在打印 newUser 对象时,密码字段的值被输出为 null。这说明了 transient 字段在对象序列化和反序列化时的作用。
除此之外,在实际应用中,我们可以根据需要,灵活使用 transient 关键字,以确保序列化对象的安全性和性能。尤其对于包含敏感数据的对象,使用 transient 可以避免敏感数据被序列化到磁盘中,从而保障数据的保密性。
由此可见,transient 关键字在 Java 编程中扮演着重要的角色,使用 transient 关键字可以有效地进行对象序列化和反序列化,优化程序性能,增加数据安全性。
版权声明: 本文为 InfoQ 作者【郑在暴富中】的原创文章。
原文链接:【http://xie.infoq.cn/article/07fe781d3a835da71e7f7dd76】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论