类加载器分类
public class StackStruTest { public static void main(String[] args) { // 对用户自定义个类来说:默认使用系统类加载器进行加载-----AppClassLoader ClassLoader classLoader = StackStruTest.class.getClassLoader(); System.out.println(classLoader); // 获取其上层:扩展类加载器 -------ExtClassLoader ClassLoader extClassLoader = classLoader.getParent(); System.out.println(extClassLoader); // 获取其上层:获取不到引导类加载器---bootStrapClassLoader ----- 但是获取不到的所以是null ClassLoader bootstrap = extClassLoader.getParent(); System.out.println(bootstrap); // 么的了,所以会报错 ClassLoader --- = bootstrap.getParent(); System.out.println(---); } }
虚拟机自带的加载器
Bootstrap ClassLoader 启动类加载器
- 这个类加载器通过c/c++语言实现,嵌套再JVM内部
- 它用来加载Java核心库(jre/lib/rt.jar)(rt:runtime)或者sun.boot.class.path路径下的内容,用于JVM自身需要的类
- 并不继承自java.lang.ClassLoader,没有父加载器
- 加载【扩展类】和【应用加载器】,并指定为他们的父类加载器
- 出于安全考虑,Bootstrap启动类加载器只加载java、javax、sun等开头的类
扩展类加载器 Extension ClassLoader
- java语言编写,由sun.misc.Launcher$ExtClassLoader实现
- 派生于ClassLoader
- 父类加载器为启动类加载器
- 从java.ext.dirs系统属性所指定的目录中加载类库,或从JDK的安装目录的jre/lib/ext子目录下加载类库。如果用户创建的JAR放在此目录下,也会自动由扩展类加载器加载
应用程序类加载器 AppClassLoader
- 由java编写,sun.misc.Launcher$AppClassLoader实现
- 派生于ClassLoader
- 父类加载器为扩展器加载器
- 它扶着加载环境变量classpath或者系统属性 java.class.path指定路径下的类库
- 该类加载是程序中默认的类加载器,一般来说,java应用的类都是由它来完成加载
- 通过ClassLoader #getSystemClassLoader()方法可以获取到该类的加载器
用户自定义加载器
ClassLoader
抽象类
getParent():返回该类的超类加载器 loadClass(String name):查找name的类,返回结果为Java.lang.class类的实例 findClass(String name):查找name的类,返回结果为java.lang.class类的实例 findLoadedCLass(String name):查找name的已经被加载过的类,返回结果为Java.lang.class类的实例 defineClass(String name, byte[]b, int off, int len):把字节数组b中的内容转换为一个Java类,返回结果为Java.lang.Class类的实例 resolveClass(Class<?>c),连接指定的java类
获取当前的ClassLoader途径
class.getClassLoader() Threa.currentThread().getContextClassLoader() ClassLoader.getSystemClassLoader() DriveManager.getCallerClassLoader()