Java 序列化与反射

目录

对象序列化概述

支持序列化的接口和类

Serializable接口

Externalizable接口

ObjectOutputStream类

transient

应用序列化编程

对象写入流的条件

反射

Java程序中对象的两种类型

获得Class对象

从Class中获取信息

使用反射生成并操作对象


一,对象序列化概述

对象记录自己状态的过程,通常被称之为对象的序列化(Serialization)

也可以理解为把对象的状态写入一个字节流的过程 。

对象逆序列化(Deserializing) :从字节流中读取对象的过程

反射就是为了在程序的运行过程中动态的获取类的方法和属性, 优点就是可以实现动态创建对象和编译,体现出很大的灵活性,缺点是对性能有影响。

序列化是将对象状态转换为容易传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

二,支持序列化的接口和类

Serializable接口

只有一个实现Serializable接口的对象可以被序列化工具存储和恢复。

Serializable接口没有定义任何成员。它只用来表示一个类可以被序列化。如果一个类可以序列化,它的所有子类都可以序列化。

Externalizable接口

可以让需要序列化的类实现Serializable接口的子接口Externalizable

Externalizable接口表示实现该接口的类在序列化中由该类本身来控制信息的写出和读入。

ObjectOutputStream类

ObjectOutputStream类继承OutputStre am 类和实现ObjectOutput 接口。负责向流写入对象。

构造方法:

 主要方法:

writeObject() 向特定的文件或网络输出对象

transient

transient修饰的属性不进行序列化的操作,起到一定消息屏蔽的效果

被transient修饰的属性可以正确的创建,但被系统赋为默认值。即int类型为0String类型为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对象对应类的实例

调用方法

访问属性值

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值