Java反射
反射:框架设计的灵魂
- 框架:半成品软件.可以在框架的基础上进行软件开发,简化编码
- 反射:将类的各个组成部分封装为其他对象,这就是反射机制,JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类、类中的方法以及属性等。
好处
可以在程序运行过程中,操作这些对象
可以解耦合,提过程序的可扩展性
获取Class对象的三种方式
- Object ——> getClass();
- 多用于对象的获取字节码的方式
任何数据类型(包括基本数据类型)都有一个“静态”的class属性
- 多用于参数的传递
通过Class类的静态方法:forName(String className)(常用)
- 对用于配置文件,将类名定义在配置文件中,读取文件,加载类.
- 结论:
- 同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的class对象都是同一个.
class类对象功能
- 获取功能:
- 获取成员变量们
- Fileld[] getFields() :获取所有public修饰的成员变量的
- Fileld getField(String name) :获取特定名称的public修饰成员变量
- Field[] getDeclaredFields() :获取所有的成员变量
- Field getDeclaredField(String name):获取特定名称的成员变量
- 获取构造方法们
- Constructor<?>[] getConstructors()
- Constructor
getConstrucotr(Class<?>…parameterTypes) - Constructor
getDeclaredConstructor(Class<?>… parameterTypes) - Constructor<?>[] getDeclaredConstructors()
- 获取成员方法们:
- Method[] getMethods()
- Method getMethod(String name,Class<?>…parameterTypes)
- Method[] getDeclaredMethods()
- Method getDeclaredMethod(String name,Class<?>… parameterTypes)
- 获取类名:
- String getName()
- 获取成员变量们
Filed: 成员变量
- 操作
- 设置值
- void set(Object obj,Object value)
- 获取值
- get(Object obj)
- 用于忽略访问权限修饰符的安全检查.
- setAccsessible(true) //暴力反射
- 设置值
- 操作
Constructor:构造方法
- 创建对象:
- T newInstance(Object…initargs)
- 如果使用空参构造方法创建对象,操作可以简化:Class对象的newInstance方法
- 创建对象:
Method:方法对象
- 执行方法:
- Object invoke(Object obj, Object… args)
- 获取方法名称:
- String getName:获取方法名
- 执行方法:
序列化和反序列化
序列化:把对象转换为字节序列的过程称为对象的序列化。
- 将对象转换为字节数组
- 将字节数组存储到磁盘
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
- 就是将字节序列转换为内存中的对象,可以是文件中的,也可以是网络传输过来的
上面是专业的解释,现在来点通俗的解释。在代码运行的时候,我们可以看到很多的对象(debug过的都造吧),
可以是一个,也可以是一类对象的集合,很多的对象数据,这些数据中,
有些信息我们想让他持久的保存起来,那么这个序列化。
就是把内存里面的这些对象给变成一连串的字节描述的过程。
常见的就是变成文件
我不序列化也可以保存文件啥的呀,有什么影响呢?我也是这么问的。
什么情况下需要序列化
当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
当你想用套接字在网络上传送对象的时候;
当你想通过RMI传输对象的时候;
(老实说,上面的几种,我可能就用过个存数据库的)
如何实现序列化
实现Serializable接口即可,对象的序列化和反序列化主要就是使用ObjectOutputStream 和 ObjectInputStream