
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
ClassLoader翻译过来就是类加载器,普通的Java开发者其实用到的不多,但对于某些框架开发者来说却非常常见。理解ClassLoader的加载机制,也有利于我们编写出更高效的代码。本文沈阳达内IT培训为大家介绍身为开发者你对 ClassLoader是如何理解的?
ClassLoader 的作用是根据一个指定的类名称找到或者生成其对应的字节代码,然后把字节码转换成一个 Java 类(即 java.lang.Class 实例),除此之外还负责加载 Java 应用所需的资源、Native lib 库等。
Java 的类加载器大致可以分成系统类加载器和应用开发自定义类加载器。系统类加载器主要有如下几个:
引导类加载器(bootstrap class loader):用来加载 Java 核心库,是虚拟机中用原生代码实现的,没有继承自 ClassLoader。
扩展类加载器(extensions class loader):用来加载 Java 的扩展库,虚拟机的实现会提供一个默认的扩展库目录,该类加载器在此目录里面查找并加载 Java 类。
系统类加载器(system class loader):用来加载应用类路径(CLASSPATH)下的 class,一般来说 Java 应用的类都是由它来完成加载的,可以通过 ClassLoader.getSystemClassLoader() 来获取它。
除了引导类加载器之外,所有的其他类加载器都有一个父类加载器(可以通过 ClassLoader 的getParent() 方法得到)。系统类加载器的父类加载器是扩展类加载器,而扩展类加载器的父类加载器是引导类加载器。
开发自定义的类加载器的父类加载器是加载此类加载器的 Java 类的类加载器。所以类加载器在尝试自己去加载某个类时会先通过 getParent() 代理给其父类加载器,由父类加载器先去尝试加载这个类,依次类推,从而形成了双亲委派模式。类加载机制是通过 loadClass 方法触发的,查找类有没有被加载和该代理给哪个层级的加载器加载是由 findClass 方法实现的,而真正完成类加载工作是 defineClass 方法实现的。