北京理工大学计算机系(共 28页) 1
反射与序列化
——面向对象技术的灵活应用第十一讲北京理工大学计算机系(共 28页) 2
反射北京理工大学计算机系(共 28页) 3
表示“类”的类
Class类提供了类数据类型的相关信息一个 Class类的对象实际上表示的是一种类型北京理工大学计算机系(共 28页) 4
获取 Class类的方法
( 1) Employee e;
……
Class cl=e.getClass();
( 2)
Class
c1=Class.forName(“java.util.Date”)
( 3) T.Class,如
Class c1= int.class
Class c2=Double[].class
北京理工大学计算机系(共 28页) 5
Class类实例:
ClassDemo.java
北京理工大学计算机系(共 28页) 6
Class类实例
ClassDemo2.java
北京理工大学计算机系(共 28页) 7
Class类实例使用 Class.forName获取类的信息:
ForNameDemo.java
北京理工大学计算机系(共 28页) 8
获取类所在的包
ClassInfoDemo.java
北京理工大学计算机系(共 28页) 9
判断对象类型
if (e.getClass().getName()==“Employee”)
……
或
if(e.getClass()==Employee.Class)
……
北京理工大学计算机系(共 28页) 10
使用 Class类创建新对象代码:
使用 Class类的 newInstance()方法实例一,调用无参构造函数:
NewInstanceDemo.java
实例二,调用有参构造函数
NewInstanceDemo2.java
北京理工大学计算机系(共 28页) 11
动态创建数组实例,NewArrayDemo.java
北京理工大学计算机系(共 28页) 12
使用 Class类获取指定类所拥有的属性,方法,构造函数等,类的这三种特性分别由
java.lang.reflect包中的 Field,
Method和 Constructor三个类来表达实例,ReflectionTest.java
北京理工大学计算机系(共 28页) 13
使用反射技术获取类信息
ReflectionTest程序运行截图:查看自己的类的信息北京理工大学计算机系(共 28页) 14
使用反射调用类的方法通过 Method类的 Invoke方法,我们可以直接调用类的方法实例,MethodPointerTest.java
北京理工大学计算机系(共 28页) 15
修改对象的字段使用 Field类的 setXXX系列方法。
实例,AssignFieldDemo.java
北京理工大学计算机系(共 28页) 16
反射技术小结通过反射,我们可以在程序运行时动态创建任意一个有效的对象,从而为我们开发
,拥抱变化,的,软插件,系统打开了大门。
但要注意,反射技术性能较差,容易引发各种异常。
北京理工大学计算机系(共 28页) 17
序列化北京理工大学计算机系(共 28页) 18
场景如何将一个对象保存到文件中,需要时再从中还原?
请仔细考虑这一问题的复杂性北京理工大学计算机系(共 28页) 19
对象的保存与重建的基本方法保存:
1,保存每个对象的类型
2,保存对象每个属性的值读取:
1,读取对象类型
2,创建一个该类型的空白对象
3,用存储在文件中的数据填充它北京理工大学计算机系(共 28页) 20
序列化技术的基本原理北京理工大学计算机系(共 28页) 21
Java解决方案
Java使用,对象序列化,的方法实现了在文件中保存与重建对象下面介绍其基本方法:
北京理工大学计算机系(共 28页) 22
创建 ObjectOutputStream对象
ObjectOutputStream out=new
ObjectOutputStream(new
FileOutputStream(“employee.dat”);
out对象现在可以用于保存对象北京理工大学计算机系(共 28页) 23
创建对象并保存
Employee harry=new…,;
Manager boss=new … ;
out.writeObject(harry);
out.writeObject(boss);
北京理工大学计算机系(共 28页) 24
读取对象
ObjectInputStream in=new
ObjectInputStream(new
FileInputStream(“employee.dat”);
Employee
e1=(Employee)in.ReadObject();
Manager
e2=(Manager)in.ReadObject();
北京理工大学计算机系(共 28页) 25
注意可以被序列化的类必须实现一个空的接口:
Serializable。
北京理工大学计算机系(共 28页) 26
对象序列化实例简单对象的序列化
ObjectFileTest.java
北京理工大学计算机系(共 28页) 27
对象序列化实例复杂对象的序列化:对象之间的相互包容
ObjectRefTest.java
北京理工大学计算机系(共 28页) 28
对象序列化的应用对象克隆:让对象实现 Cloneable,
Serializable
SerialCloneTest.java
反射与序列化
——面向对象技术的灵活应用第十一讲北京理工大学计算机系(共 28页) 2
反射北京理工大学计算机系(共 28页) 3
表示“类”的类
Class类提供了类数据类型的相关信息一个 Class类的对象实际上表示的是一种类型北京理工大学计算机系(共 28页) 4
获取 Class类的方法
( 1) Employee e;
……
Class cl=e.getClass();
( 2)
Class
c1=Class.forName(“java.util.Date”)
( 3) T.Class,如
Class c1= int.class
Class c2=Double[].class
北京理工大学计算机系(共 28页) 5
Class类实例:
ClassDemo.java
北京理工大学计算机系(共 28页) 6
Class类实例
ClassDemo2.java
北京理工大学计算机系(共 28页) 7
Class类实例使用 Class.forName获取类的信息:
ForNameDemo.java
北京理工大学计算机系(共 28页) 8
获取类所在的包
ClassInfoDemo.java
北京理工大学计算机系(共 28页) 9
判断对象类型
if (e.getClass().getName()==“Employee”)
……
或
if(e.getClass()==Employee.Class)
……
北京理工大学计算机系(共 28页) 10
使用 Class类创建新对象代码:
使用 Class类的 newInstance()方法实例一,调用无参构造函数:
NewInstanceDemo.java
实例二,调用有参构造函数
NewInstanceDemo2.java
北京理工大学计算机系(共 28页) 11
动态创建数组实例,NewArrayDemo.java
北京理工大学计算机系(共 28页) 12
使用 Class类获取指定类所拥有的属性,方法,构造函数等,类的这三种特性分别由
java.lang.reflect包中的 Field,
Method和 Constructor三个类来表达实例,ReflectionTest.java
北京理工大学计算机系(共 28页) 13
使用反射技术获取类信息
ReflectionTest程序运行截图:查看自己的类的信息北京理工大学计算机系(共 28页) 14
使用反射调用类的方法通过 Method类的 Invoke方法,我们可以直接调用类的方法实例,MethodPointerTest.java
北京理工大学计算机系(共 28页) 15
修改对象的字段使用 Field类的 setXXX系列方法。
实例,AssignFieldDemo.java
北京理工大学计算机系(共 28页) 16
反射技术小结通过反射,我们可以在程序运行时动态创建任意一个有效的对象,从而为我们开发
,拥抱变化,的,软插件,系统打开了大门。
但要注意,反射技术性能较差,容易引发各种异常。
北京理工大学计算机系(共 28页) 17
序列化北京理工大学计算机系(共 28页) 18
场景如何将一个对象保存到文件中,需要时再从中还原?
请仔细考虑这一问题的复杂性北京理工大学计算机系(共 28页) 19
对象的保存与重建的基本方法保存:
1,保存每个对象的类型
2,保存对象每个属性的值读取:
1,读取对象类型
2,创建一个该类型的空白对象
3,用存储在文件中的数据填充它北京理工大学计算机系(共 28页) 20
序列化技术的基本原理北京理工大学计算机系(共 28页) 21
Java解决方案
Java使用,对象序列化,的方法实现了在文件中保存与重建对象下面介绍其基本方法:
北京理工大学计算机系(共 28页) 22
创建 ObjectOutputStream对象
ObjectOutputStream out=new
ObjectOutputStream(new
FileOutputStream(“employee.dat”);
out对象现在可以用于保存对象北京理工大学计算机系(共 28页) 23
创建对象并保存
Employee harry=new…,;
Manager boss=new … ;
out.writeObject(harry);
out.writeObject(boss);
北京理工大学计算机系(共 28页) 24
读取对象
ObjectInputStream in=new
ObjectInputStream(new
FileInputStream(“employee.dat”);
Employee
e1=(Employee)in.ReadObject();
Manager
e2=(Manager)in.ReadObject();
北京理工大学计算机系(共 28页) 25
注意可以被序列化的类必须实现一个空的接口:
Serializable。
北京理工大学计算机系(共 28页) 26
对象序列化实例简单对象的序列化
ObjectFileTest.java
北京理工大学计算机系(共 28页) 27
对象序列化实例复杂对象的序列化:对象之间的相互包容
ObjectRefTest.java
北京理工大学计算机系(共 28页) 28
对象序列化的应用对象克隆:让对象实现 Cloneable,
Serializable
SerialCloneTest.java