类加载器 类的加载过程: Java文件--->Class文件(字节码文件)--->虚拟机进行解释 加载类的时机: 1、创建类的对象 2、调用类的类方法 3、访问类或接口的类变量或为类变量赋值 4、使用反射方式来强制创建某个类或接口的Class对象 5、初始化某个类的子类 6、直接使用java.exe命令来运行某个类 其实就是只要实用了这个类或这个类的成员或者这类的子类,这时候就会加载这个类到虚拟机 类的加载过程: 1、通过一个类的全限定名(包名.类名)获取定义这个类的二进制字节流。 2、把这个字节流的静态存储结构转换为运行时数据结构 3、在内存中生成一个代表这个类的java.lang.Class对象,任何类在被使用的时候,系统都会创建他的java.lang.Class对象 类的加载过程: 1、加载 |-通过包名.类名,找到这个类,并且准备使用流进行传输 |-就是把这个类加载到内存中,当加载完毕之后,就会创建一个Class对象 2、链接 |-1、验证 验证阶段是链接阶段的第一步 保证Class文件的字节流中包含的信息能够符合当前虚拟机的需求 检查文件中的信息是不是符合虚拟机的规范,有没有安全隐患 |-2、准备 负责将类的类变量(static修饰的)分配内存,并且设置默认的初始化值。 |-3、解析 把类的二进制数据流中的符号引用替换为直接引用。 如果当前类中引用了其他类,这个时候就需要找到对应的类。 3、初始化 根据我们通过程序指定的主管计划进行初始化类变量和其他的资源, 比如进行静态变量赋值,或者进行其他的初始化资源 类的加载过程: 1、把Student.java文件编译成Student.class文件字节码文件 2、拿到了字节码文件后,开始进入到【加载】阶段,通过包名.类名获取这个类。 并且把这个类加载到内存中。加载完成后创建一个Class对象。 3、进入【链接】阶段,链接阶段主要做3件事:验证、准备、初始化。 验证:检查一下 准备:提前把需要加载的类的静态变量这种先加载,并初始化默认值。 解析:把符号引用替换为直接引用。 4、进入到【初始化】阶段:完成初始化工作,比如对静态变量进行赋值 类的加载器分类: BootstrapClassLoader:Java虚拟机内置的类加载器,一般表示为null,并且没有父null。 PlatformClassLoader:平台类加载器,负责加载JDK中的一些特殊的模块 SystemClassLoader:系统类加载器,负责加载用户的类路径上指定的类库。 继承关系: SystemClassLoader的父加载器是PlatformClassLoader, PlatformClassLoader的父加载器是BootstrapClassLoader 双亲委派模型 如果一个类加载器收到了类加载请求,它绝不会自己先去加载,而是把这个请求委托给父类的加载器去执行。 如果父类的加载器还存在父类加载器,就会再次向上委托,依次递归,直到请求最终到达最顶层的启动类加载器。 如果父类加载器可以完成类加载任务,就成功返回。如果父类加载器不能完成任务,子类加载器才会尝试自己加载, 这就是双亲委派模式。