一,对象序列化概述
对象记录自己状态的过程,通常被称之为对象的序列化(Serialization) 。
也可以理解为把对象的状态写入一个字节流的过程 。
对象逆序列化(Deserializing) :从字节流中读取对象的过程
反射就是为了在程序的运行过程中动态的获取类的方法和属性, 优点就是可以实现动态创建对象和编译,体现出很大的灵活性,缺点是对性能有影响。
序列化是将对象状态转换为容易传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
二,支持序列化的接口和类
Serializable接口
只有一个实现Serializable接口的对象可以被序列化工具存储和恢复。
Serializable接口没有定义任何成员。它只用来表示一个类可以被序列化。如果一个类可以序列化,它的所有子类都可以序列化。
Externalizable接口
可以让需要序列化的类实现Serializable接口的子接口Externalizable。
Externalizable接口表示实现该接口的类在序列化中由该类本身来控制信息的写出和读入。
ObjectOutputStream类
ObjectOutputStream类继承OutputStre am 类和实现ObjectOutput接口。负责向流写入对象。
构造方法:
主要方法:
writeObject() 向特定的文件或网络输出对象
transient
transient修饰的属性不进行序列化的操作,起到一定消息屏蔽的效果
被transient修饰的属性可以正确的创建,但被系统赋为默认值。即int类型为0,String类型为null 。
三,应用序列化编程
对象写入流的条件
该类必须被声明为public
该类必须实现Serializable接口
如果该类有直接或者间接的不可序列化的基类,那么该基类必须有一个默认的构造器。该派生类需要负责将其基类中的数据写入流中
四,反射
Java程序中对象的两种类型
编译时类型
运行时类型
编译时类型与运行时类型不同如何处理?
编译时和运行时都知道类型信息,则用强制类型转换。
编译时无法预知对象和类属于哪些类,程序只能依靠运行时信息来发现该对象和类的信息,这就必须用反射。
获得Class对象
使用Class类的forName(String className)静态方法
调用某个类的class属性来获取该类对应的Class对象(常用方法)
代码更安全
程序性能更好
调用某个对象的getClass()方法。
从Class中获取信息
获取Class对应类包含的构造器
获取Class对应类所包含的方法
获取Class对应类所包含的Field
获取Class对应类的修饰符、所在包、类名等
使用反射生成并操作对象
创建对象
使用Class对象的newInstance()方法来创建Class对象对应类的实例
先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建Class对象对应类的实例
调用方法
访问属性值