首页 > 代码库 > ClassLoader

ClassLoader

作用

查找类的字节码文件,并构造出类在java虚拟机内部表示对象的组件。

步骤

  1. 装载(查找和导入Class文件)由ClassLoader及其子类负责。JVM运行过程中会产生3个ClassLoader, 分别为BootStrap Loader(c++编写,装载JRE的核心类库)、ExtClassLoader(JRE扩展目录ext中的JRE类包)、AppClassLoader(ClassPath路径下的类包)。注意ExtClassLoader、AppClassLoader均有BootStrap Loader加载。AppClassLoader父加载器是ExtClassLoader,ExtClassLoader父加载器是BootStrap Loader。
  2. 链接 执行校验(确保Java类的二进制表示在结构上完全正确)、准备(静态变量分配空间,设默认值)和解析(可选,将符号引用转为直接引用)步骤。
  3. 初始化 对类的静态变量、静态代码进行初始化工作。

全盘负责双亲委托机制

  1. 全盘负责 是指当一个ClassLoader装载一个类时,除非显示地使用另一个ClassLoader,则该类所依赖及引用的类也由这个CladdLoader载入。应用类加载器AppClassLoader加载入口类(含有main方法的类)时,会把main方法所依赖的类及引用的类也载入,依此类推。以上步骤并没有真正定义类。真正加载class字节码文件生成Class对象由“双亲委派”机制完成。
  2. 双亲委托机制 是指子类加载器如果没有加载过该目标类,就先委托父类加载器加载该目标类,只有在父类加载器找不到字节码文件的情况下才从自己的类路径中查找并装载目标类。

java.lang.Class 类描述对象

  类文件被装载解析后,在JVM内部将拥有一个对应的Java.lang.Class类描述对象,该类的实例都拥有指向这个类描述对象的引用,而类描述对象又拥有指向关联ClassLoader的引用。Java.lang.Class没有public的构造方法。Class对象是在装载类时由JVM通过调用ClassLoader中的defineClass()方法自动构造的。 

ClassLoader 常用方法

  1. Class loadClass(String name)  及 重载方法loadClass(String name ,boolean resolve)   name(指定类装载器需要装载类的名字,必须使用全限定类名) resolve(类装载器是否需要解析该类)
  2. Class defineClass(String name,byte[],int off,int len)将类文件的字节数组转换成JVM内部的java.lang.Class对象
  3. Class findSystemClass(String name) 从本地文件系统载入Class文件
  4. Class findLoadedClass(String name)调用该方法来查看ClassLoader是否已装入某个类

ClassLoader getParent()获取类装载器的父装载器,除根装载器外,所有的类装载器都有且仅有一个父装载器,ExtClassLoader的父装载器是根装载器,因为根装载器非Java编写,所以无法获得,将返回null。

ClassLoader