类加载器
-
classs文件 class文件是以8位字节为单位的二进制流文件 魔数:class文件的头4位为魔数,用于确认文件是否能被虚拟机加载 版本:第5,6位是次版本号;第7,8 位是主版本好 1.7版本编译器编译的class文
-
类加载器 启动类加载器 (BootStrap ClassLoader) C++编写 加载
/lib文件夹下的核心库 命名规范(Bootstrap启动类加载器只加载包名为java、javax、sun等开头的类) 扩展类加载器(Extension ClassLoader) 加载 /lib/ext 系统类加载器( Application ClassLoader) -
双亲委派模型 加载一个类的时候,会先委托给父类,只有父类无法加载的时候才会自己加载
LoadClass类 由代码可以看出调用loadClass方法时,先去检查系统是否已经加载过该类,如果没有,则先委托给父类。此处先检查有没有父类,没有则使用启动类加载器去加载。(除了启动器类加载器没有父加载器外,其他所有的类都父加载器)。如果父加载器还是没有加载该类,则自己加载该类。这里使用了findClass()
findClass loadClasss(String)方法已经使用了双亲模式的逻辑。用户实现自己的类加载器时,只需重写findClass
实现findClass需要将class文件以字节数组的方式读入,然后加载进jvm即可。 defineClass 用于生成对应的clas类对象
resolveClass(Class≺?≻ C) 使用该方法可以使用类的Class对象创建完成也同时被解析
- 从类加载到对象可以被使用的过程
加载 将class文件加载进虚拟机,并生成一个Class对象 链接 验证:确保class文件可以被正确加载,不会危害到虚拟机 准备:为类变量分配初始值(如static int i=5;这里只将i初始化为0,至于5的值将在初始化时赋值)。Final修饰的static变量在编译阶段已经分配 解析:主要将常量池中的符号引用替换为直接引用的过程 初始化 类加载最后阶段,若该类具有超类,则对其进行初始化,执行静态初始化器和静态初始化成员变量。 超类(父类先初始化)->执行静态初始化器