要弄清楚反射,先得弄清楚类加载过程和Class类中的内容

类加载过程

  • ClassLoader类有三个具体实现,AppClassLoaderExtClassLoaderBootStrapClassLoader,并且类中有一个parent对象指向父加载器。
  • 当执行类加载过程时,执行loadClass()方***对进行类的字符串进行加锁,并且先判断是否加载过这个类,如果父类不为空,则调用parent.loadClass();加载成功则直接返回Class对象。
  • 当加载失败时会执行findClass()方法(用户来重写,默认直接抛出ClassNotFoundException),在findClass()中调用defineClass(name, b, 0, b.length)来返回一个Class对象,通过类名和byte[]表示类。

Class类中的内容

  • 图片说明
  • 图片说明

反射(ToDo)

  • 用途
    • 创建实例
        Class clazz = Class.forName("全类名");
        // 需要强转一下类型,并且只有clazz有无参构造方法时才能调用该方法
        clazz.newInstance();
    • 调用方法
        Class clazz = Class.forName("全类名");
        // 获取Method
        Method method = clazz.getMethod();
        method.invoke(obj, args);