[原创] 类加载器学习笔记

类加载器

  1. classs文件  class文件是以8位字节为单位的二进制流文件  魔数:class文件的头4位为魔数,用于确认文件是否能被虚拟机加载  版本:第5,6位是次版本号;第7,8 位是主版本好  1.7版本编译器编译的class文

  2. 类加载器  启动类加载器 (BootStrap ClassLoader)  C++编写  加载/lib文件夹下的核心库  命名规范(Bootstrap启动类加载器只加载包名为java、javax、sun等开头的类)  扩展类加载器(Extension ClassLoader)  加载/lib/ext  系统类加载器( Application ClassLoader)

  3. 双亲委派模型 加载一个类的时候,会先委托给父类,只有父类无法加载的时候才会自己加载

 LoadClass类 由代码可以看出调用loadClass方法时,先去检查系统是否已经加载过该类,如果没有,则先委托给父类。此处先检查有没有父类,没有则使用启动类加载器去加载。(除了启动器类加载器没有父加载器外,其他所有的类都父加载器)。如果父加载器还是没有加载该类,则自己加载该类。这里使用了findClass()

 findClass loadClasss(String)方法已经使用了双亲模式的逻辑。用户实现自己的类加载器时,只需重写findClass

实现findClass需要将class文件以字节数组的方式读入,然后加载进jvm即可。  defineClass 用于生成对应的clas类对象

 resolveClass(Class≺?≻ C) 使用该方法可以使用类的Class对象创建完成也同时被解析

  1. 从类加载到对象可以被使用的过程

 加载 将class文件加载进虚拟机,并生成一个Class对象  链接  验证:确保class文件可以被正确加载,不会危害到虚拟机  准备:为类变量分配初始值(如static int i=5;这里只将i初始化为0,至于5的值将在初始化时赋值)。Final修饰的static变量在编译阶段已经分配  解析:主要将常量池中的符号引用替换为直接引用的过程  初始化 类加载最后阶段,若该类具有超类,则对其进行初始化,执行静态初始化器和静态初始化成员变量。  超类(父类先初始化)->执行静态初始化器