Java瞬态变量transient
我们都知道,阳光是看得见却摸不着的。它真实的存在,但是却无法将其装在罐子里,这是因为光子不具有静止质量。这注定我们只能利用光子而不能将其捕获(或许只是暂时)。在Java中,有一种变量就像光子一样,我们可以利用它完成业务逻辑,但是却无法将其序列化保存在磁盘中(就像光子无法放在罐子里)。这种被transient关键字修饰的变量我们称之为瞬态变量。
一、Transient的作用:
在Java中,只要一个对象实现了Serilizable接口,该类的所有属性和方法都将会自动序列化,使用起来非常方便。
但是有时我们在使用序列化的时候,只需要类中的一部分序列化,而另一部分则不序列化,比如用户的银行卡信息等,这些信息我们不希望在网络操作中被传输,为了安全起见,我们就可以给它们加上transient关键字,成为瞬态变量。这样一来,这些字段的生命周期就只存在于调用者的内存中,而不会在磁盘中持久化。
class User implements Serializable {
private static final long serialVersionUID = 8294180014912103005L;
private String username;
private transient String passwd;//瞬态变量,序列化的时候会被忽略掉
public String getUsername() {return username; }
public void setUsername(String username) {this.username = username;}
public String getPasswd() {return passwd; }
public void setPasswd(String passwd) {this.passwd = passwd; }
}
二、Transient使用总结
- 变量被transient修饰则不再是对象持久化的一部分,该变量内容在序列化之后将无法访问(获得)。
- Transient只能修饰变量,不能修饰方法和类。本地变量不能被transient来修饰,自定义类需要实现Serializable接口(不能是Externalizable接口)。
- 被transient修饰的变量将不能序列化,被static关键字修饰的静态变量无论是否有transient,都不能被序列化(即静态变量不能序列化)。
- Transient并不是一种很好的局部序列化的方式,因为在使用它之后,被transient修饰的变量返回的都是默认值,这很容易在程序中引发我们意想不到的结果(比如等值判断或是数据库写入操作等),因此并不推荐使用transient瞬态变量。
三、注意
虽然transient关键字用于声明瞬态变量,在序列化的时候不会被持久化到磁盘。但是能不能序列化被transient关键字修饰的变量,这是根据类实现的序列化接口决定的。例如:Serializable接口中,若没有强制指定序列化属性,则transient有效;若Serializable接口中指定了强制序列化的属性,则transient无效;而Externalizable接口本身就需要指定序列化的属性,所以transient在该接口中无效。
Java瞬态变量transient的更多相关文章
- Java 中关键字transient引出序列化与反序列化
一:transient(临时的)关键字 1.transient关键字只能修饰变量,而不能修饰方法和类.注意,本地变量是不能被transient关键字修饰的. 2.被transient关键字修饰的变量不 ...
- 关于Java中的transient关键字
Java中的transient关键字是在序列化时候用的,如果用transient修饰变量,那么该变量不会被序列化. 下面的例子中创建了一个Student类,有三个成员变量:id,name,age.ag ...
- java中变量命名和引用变量的一个坑
这次有两个主题,第一个太简单啦,就是java中变量的命名规则,纯记忆性东西.第二个主题,就是讨论一下对象引用变量的一个注意点.
- java环境变量配置
1.打开我的电脑--属性--高级--环境变量 2.新建系统变量JAVA_HOME 和CLASSPATH 变量名:JAVA_HOME 变量值:C:\Program Files\Java\jdk1.7.0 ...
- Ubuntu中配置Java环境变量时,出现command not found问题解决记录
百度出Ubuntu中配置Java环境变量时,在利用sudo gedit /etc/profile 对profile编辑后, 在terminal中输入 sudo source /etc/profile, ...
- JAVA基础学习——1.3 关于JAVA环境变量设定 Path,Java_Home,ClassPath
在安装完JDK以后,要设定JAVA环境变量. 刚接触的时候,我很困惑,这特么什么玩意啊,然后知其然不知其所以然的 按照说明做完了却不知道为什么这么做,这里简单做一些总结说明. 首先,什么是环境变量 环 ...
- Java环境变量的简记
1,安装版的jre或jdk.安装后如果不做开发用,则只是做Java运行时环境,则不需要手动配置任何Java环境变量. 2,绿色解压版(拷贝版)jdk或jre.运行和开发都需要配置环境变量. 运行Jav ...
- Java环境变量
很简单的问题!配置Java环境变量 准备 下载安装Java,官方地址 打开系统环境变量,我的电脑右键 JAVA_HOME 添加JAVA_HOME,设置jdk安装目录,比如"C:\Progra ...
- mac java环境变量设置
Mac下添加java环境变量 方法一:全局配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #临时提权 sudo su #输入密码 vi /et ...
随机推荐
- \\u4e00-\\u9fa5\
select * from stu where name regexp '[\\u4e00-\\u9fa5\·]{2,10}$'; 结果: name这个字段从后到前 2 到10个字符之内 如果有汉字 ...
- String为什么要设置成Final类型
---今天面试碰到个这样的问题:String在设计的时候为什么要设计成final的 当时回答的是String功能已经很丰富了,不需要对其进行扩展,所有巴拉巴拉. 现在来正确看看为什么定义成final ...
- videojs兼容ie8
从网上找到很多这个videojs兼容ie8的解决方案,一个一个的试,最后发现没有一个是靠谱的.我好无奈啊…… 先看图(ie上访问必须是线上地址) 看代码: <!DOCTYPE html> ...
- CF833 A The Meaningless Game
题干 Slastyona and her loyal dog Pushok are playing a meaningless game that is indeed very interesting ...
- java NIO 实例之多人聊天
关键抽象 1.定义一个HashMap<String,SocketChannel>用户存储每个用户的管道. 2.服务端监听read事件,获取消息后轮询hashmap发送消息给用户模型内的所有 ...
- MVC引用asp.net报表(测试小例子)
public class Default1Controller : Controller { // // GET: /Default1/ public ActionResult Index() { r ...
- Jmeter系列(36)- 详解 Loop Controller 循环控制器
如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 前言 这应该是最简单的控制器了,我们快 ...
- XSS与CSRF定义
一. CSRF 1. CSRF的基本概念 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通 ...
- SQL列转行,行转列实现
在工作中,大家可能会遇到一些SQL列转行.行转列的问题,恰好,我也遇到了,就在此记录一下.此处所用的是SQLServer2008R2. 行转列,列转行,都要预先知道要要处理多少数据,在此我就以三种方案 ...
- python 生成器(一):生成器基础(一)生成器函数
前言 实现相同功能,但却符合 Python 习惯的方式是,用生成器函数代替SentenceIterator 类.示例 14-5 sentence_gen.py:使用生成器函数实现 Sentence 类 ...