上一篇:JVM(一)—基础概念
常说的双亲委派机制
实际上是类加载器(Class Cloader)
的一种加载机制。
1.什么是类加载器?
我们在进行java程序开发的时候,.java
文件会经过javac
命令编译为.class字节码文件
,而类加载器的职责就是动态的加载这些.class
文件到JVM内存空间中,类通常是在第一次使用它的时候进行加载,也就是说,如果没有使用过该类,则该类不会被加载到JVM中。
2.加载器有哪些?
1.BootStrap Loader
引导类加载器是用本地代码实现的类加载器,它负责将<JAVA_HOME>/lib下面的核心类库 或 -Xbootclasspath选项指定的jar包等虚拟机识别的类库加载到内存中。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。
2.ExtClass Loader
扩展类加载器负责将 <JAVA_HOME >/lib/ext或者由系统变量-Djava.ext.dir指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器。
3.Application Loader
应用程序类加载器(系统类加载器)负责将用户类路径(java -classpath或-Djava.class.path变量所指的目录,即当前类所在路径及其引用的第三方类库的路径下的类库 加载到内存中。如果没有自定义过类加载器,则默认应用程序类加载器
为程序默认的加载器。
3.类加载流程?
1.类加载器收到class文件加载请求
2.收到请求的加载器会将此请求委派给其父加载器
进行加载,此父加载器
上面还有父加载器
,加载请求继续向上传递。
所以一个类加载请求会先由最上层的加载器进行加载,如果此加载器在其范围内找到所需的类的时候,就处理成功。否则会交由其下一层的加载器(它儿子)来处理此请求。
4.获取类加载器的方法?
public static void main(String[] args) {
Student student = new Student();
//1.获取某class对象
Class<? extends Student> studentClass = student.getClass();
//2.获取该class对象的加载器
ClassLoader classLoader = studentClass.getClassLoader();
System.out.println(classLoader);
//3.获取该加载器的父加载器
ClassLoader parentClassLoader = classLoader.getParent();
System.out.println(parentClassLoader);
//4.获取该父加载器的父加载器
ClassLoader grandFatherLoader = parentClassLoader.getParent();
System.out.println(grandFatherLoader);
}