预防针先打着,这篇文章我准备搬大部分,不要骂我
参考链接:
深入理解Java类加载器(ClassLoader)
Java类加载机制
深入理解Java类加载
Class类
没有条理,只做记录
Java程序运行时,系统一直对所有的对象进行这所谓的运行时类型标识。这项信息记录了每个对象所属的类。虚拟机通常使用该信息去选择正确的对象与方法执行,而用来保存这些类型信息的类就是Class类。Class封装一个对象和接口运行时的状态,当加载一个类的时候,Class类的对象就被创建了,也就是说,一个Class类的对象封装了一个类的类型信息,可以通过该对该对象的操作来实现对类的操作,这就是反射的原理。
既然Class类的对象封装了一个类的信息,这些信息一般包括类名、实现的接口、父类、成员方法、成员变量、注解等信息,也就是说,我们可以操作这些信息。
Class类的每一个实例都代表着一个运行中的类
Class类没有公有的构造方法,这也就意味着其不能通过new的方式来创建一个实例,Class类的对象是由jvm来创建的。
同时需要知道在JVM中,每个类只有唯一的一个Class对象,而标识一个唯一的类是通过他的完全限定名以及加载他的类加载器。在运行程序的时候,JVM首先会在缓存中判断当前类是不是已经被加载了,也就是findLoadedClass方法。如果没有加载,然后会将加载的权限交给当前类加载器的父类加载器加载,父类加载器会继续向上递交加载权限,知道某一级加载器的父类为null之后,该类的加载权限会被交给启动类加载器,启动类加载器如果不能加载该类,则向下一次按相反的顺序移交加载权限,直到某一级成功加载该类,这就是java的双亲委派机制,下面我们会从代码层面观察该机制。类加载器加载类是通过loadClass方法实现的。在loadClass方法中类加载最下层调用了一个称为findClass的方法,该方法实现了将class文件加载到内存,然后再通过defineClass方法将字节码转换为一个java Class对象。
我们可以通过下面演示的集中方式获得一个Class对象