类加载过程

概念

  • 将class文件从磁盘加载到内存中,并获取class文件中的数据,对这些数据进行解析,转换等操作,最终成为可使用的java类型,此过程称为---类加载过程

过程

  • 加载、连接、初始化、使用、卸载

加载

  • 将class文件从磁盘内存中,为当前这个class文件自动创建一个Class对象

连接

  • 验证class文件中内部结构,将一些符号名称转为对应的数据

什么时候加载类

  • 1.创建该类型对象
  • 2.访问静态成员时
  • 3.获取Class对象时
  • 4.创建子类对象时,父类class文件
  • 5.执行java.exe命令
  • ...

类加载器

概念

  • 类加载器是一个对象,作用:用来加载class文件,从磁盘到内存,并为该class文件,创建一个Class对象

分类

  • Bootstrap ClassLoader

    • 引导类加载器 父
  • Extension ClassLoader

    • 扩展类加载器 子
  • Application ClassLoader

    • 系统类加载器 子子
  • 自定义类加载器,定义类继承ClassLoader

加载类时,采用一种委托机制

  • 加载类时,会逐级向上委托(App-->ext-->boot,此时不会搜索该类是否存在),boot没有父类,此时boot会查找它的包含范围中是否有该class,如果有就加载,如果没有找ext,ext会查找它的包含范围中是否有该class,如果有就加载,如果没有找app,查找它的包含范围中是否有该class,如果有就加载,如果没有抛出异常,ClassNotFoundException。

反射技术

步骤

  • 1、获取Class对象,该Class对象代表这个一个class文件
  • 2、获取Class的对象表示的class文件中的内容,并对这些内容进行想要的操作

反射技术的源头

  • Class对象

获取Class对象

  • 1、已有对象的情况下

    • getClass()
  • 2、已知全类名的情况下

    • 类型名.class
  • 3、已知全类名的情况下

    • Class.forName("包名.类名")

Class类

  • java.lang包中的对象

    • Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注解是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。
  • Class类中的方法

    • newInstance()

      • 创建此Class对象所表示的类的一个新实例
    • 创建对象时,要保证对象类中需要有无参数构造方法,因为创建对象调用的是该方法

    • Class的对象表示一个运行时的类,那么类中有成员(属性、方法、构造方法...)可以进行获取和操作。java是面向对象思想,因此属性、方法、构造方法也能封装成对应的类形式,即对象形式,属性(字段)--->Field ,方法--->Method, 构造方法--->Constructor。

Constructor类

  • newInstance(Object... initargs)

    • 使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
  • getName()

    • 获取方法名
  • Modifier.toString(c.getModifiers());

    • 获取修饰符
  • 获取构造方法们

    • Constructor<?>[] getConstructors()

      • 获取所有公共构造方法
    • Constructor getConstructor(类<?>……parameterTypes)

      • 获取某个公共构造方法
    • Constructor getDeclaredConstructor(类<?>……parameterTypes)

      • 获取某个构造方法,不考虑修饰符
    • Constructor<?>[] getDeclaredConstructors()

      • 获取所有构造方法,不考虑修饰符

Field,字段类,即类中属性

  • 获取成员变量们

    • Field[] getfields()

      • 获取所有公共成员变量
    • Field getField(String name)

      • 获取某个公共成员变量
    • Field[] getDeclaredFields()

      • 获取所有成员变量,不考虑修饰符
    • Field getClareField(String name)

      • 获取某个成员变量,不考虑修饰符
  • 设置属性值

    • set(Object obj,Object value)

      • 将指定对象变量上此Field对象表示的字段设置为指定的新值
    • get(Object obj)

      • 返回指定对象上此Field表示的字段值
  • getType()

    • 返回类型

Method类,用于封装方法的对象类

  • 获取成员方法们

    • Method[] getMethods()

      • 获取所有的公共方法,包括父类的
    • Mehtod getMethod(String name, 类<?>……parameterTypes)

      • 获取某个公共方法
    • Method[] getDeclaredMethods()

      • 获取所有方法,包括当前类
    • Mehtod getDeclaredMethod(String name, 类<?>……parameterTypes)

      • 获取某个方法,不考虑修饰符
  • invoke(Object obj,Object… args)

    • 对带有指定参数的指定对象调用由此Method对象表示的底层方法
  • getReturnType();

    • 获取返回值类型
  • getExceptionTypes()

    • 获取异常类型

setAccessible(true);

  • 暴力反射,不受权限修饰符限制