反射相关内容

Java反射

反射:框架设计的灵魂

  • 框架:半成品软件.可以在框架的基础上进行软件开发,简化编码
  • 反射:将类的各个组成部分封装为其他对象,这就是反射机制,JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类、类中的方法以及属性等。
  • 好处

    1. 可以在程序运行过程中,操作这些对象

    2. 可以解耦合,提过程序的可扩展性

获取Class对象的三种方式

  • Object ——> getClass();
    • 多用于对象的获取字节码的方式
  • 任何数据类型(包括基本数据类型)都有一个“静态”的class属性

    • 多用于参数的传递
  • 通过Class类的静态方法:forName(String className)(常用)

    • 对用于配置文件,将类名定义在配置文件中,读取文件,加载类.
  • 结论:
    • 同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的class对象都是同一个.

class类对象功能

  • 获取功能:
    1. 获取成员变量们
      • Fileld[] getFields() :获取所有public修饰的成员变量的
      • Fileld getField(String name) :获取特定名称的public修饰成员变量
      • Field[] getDeclaredFields() :获取所有的成员变量
      • Field getDeclaredField(String name):获取特定名称的成员变量
    2. 获取构造方法们
      • Constructor<?>[] getConstructors()
      • Constructor getConstrucotr(Class<?>…parameterTypes)
      • Constructor getDeclaredConstructor(Class<?>… parameterTypes)
      • Constructor<?>[] getDeclaredConstructors()
    3. 获取成员方法们:
      • Method[] getMethods()
      • Method getMethod(String name,Class<?>…parameterTypes)
      • Method[] getDeclaredMethods()
      • Method getDeclaredMethod(String name,Class<?>… parameterTypes)
    4. 获取类名:
      • String getName()
  • Filed: 成员变量

    • 操作
      1. 设置值
        • void set(Object obj,Object value)
      2. 获取值
        • get(Object obj)
      3. 用于忽略访问权限修饰符的安全检查.
        • setAccsessible(true) //暴力反射
  • Constructor:构造方法

    • 创建对象:
      • T newInstance(Object…initargs)
      • 如果使用空参构造方法创建对象,操作可以简化:Class对象的newInstance方法
  • Method:方法对象

    • 执行方法:
      • Object invoke(Object obj, Object… args)
    • 获取方法名称:
      • String getName:获取方法名

序列化和反序列化

序列化:把对象转换为字节序列的过程称为对象的序列化。

  1. 将对象转换为字节数组
  2. 将字节数组存储到磁盘

反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

  1. 就是将字节序列转换为内存中的对象,可以是文件中的,也可以是网络传输过来的

上面是专业的解释,现在来点通俗的解释。在代码运行的时候,我们可以看到很多的对象(debug过的都造吧),
可以是一个,也可以是一类对象的集合,很多的对象数据,这些数据中,
有些信息我们想让他持久的保存起来,那么这个序列化。
就是把内存里面的这些对象给变成一连串的字节描述的过程。
常见的就是变成文件
我不序列化也可以保存文件啥的呀,有什么影响呢?我也是这么问的。

什么情况下需要序列化

当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
当你想用套接字在网络上传送对象的时候;
当你想通过RMI传输对象的时候;
(老实说,上面的几种,我可能就用过个存数据库的)

如何实现序列化

实现Serializable接口即可,对象的序列化和反序列化主要就是使用ObjectOutputStream 和 ObjectInputStream

Thanks!