美文网首页
类加载器及双亲委派机制

类加载器及双亲委派机制

作者: overflowedstack | 来源:发表于2021-05-16 18:26 被阅读0次

一. 类的加载

java class是由class loader 类加载器加载到JVM内存中的。
看下下面的demo,java中有三种类加载器。

  • 首先,我们自己定义的这个classLoaderDemo类,是由AppClassLoader(应用类加载器)加载到内存的。AppClassLoader主要负责加载应用程序的主函数类。
  • AppClassLoader的父classLoader是ExtClassLoader(扩展类加载器)。ExtClassLoader负责加载java的扩展类库。
  • ExtClassLoader的父加载器在这个demo中看不粗来,其实它的父加载器是BootstrapClassLoader。BootstrapClassLoader也就是启动类加载器,它不是一个java class,是特定于平台的机器指令,负责开启整个加载过程。主要负责加载核心的类库(java.lang.*等),构造ExtClassLoader和APPClassLoader。
public class ClassLoaderDemo {

    public static void main(String[] args) {
        ClassLoader cl = ClassLoaderDemo.class.getClassLoader();
        System.out.println("class loader for ClassLoaderDemo is " + cl);
        System.out.println("parent class loader is " + cl.getParent());
        System.out.println("parent for parent class loader is " + cl.getParent().getParent());
        
        ClassLoader strCl = String.class.getClassLoader();
        System.out.println("class loader for String is " + strCl);
        
        try {
            ClassLoader listCl = cl.getParent().loadClass("java.util.List").getClass().getClassLoader();
            System.out.println("class loader for List is " + listCl);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        
        System.out.println("BootStrap ClassLoader path " + System.getProperty("sun.boot.class.path"));
        System.out.println("Extention ClassLoader path " + System.getProperty("java.ext.dirs"));
        System.out.println("Application ClassLoader path  " + System.getProperty("java.class.path"));
    }

}

输出:

class loader for ClassLoaderDemo is sun.misc.Launcher$AppClassLoader@4e25154f
parent class loader is sun.misc.Launcher$ExtClassLoader@33909752
parent for parent class loader is null
class loader for String is null
class loader for List is null
BootStrap ClassLoader path /Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/sunrsasign.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/classes
Extention ClassLoader path /Users/username/Library/Java/Extensions:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/ext:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java
Application ClassLoader path  /Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/System/Library/Java/Extensions/MRJToolkit.jar:/Users/username/Documents/java/myredis/target/classes:/Users/username/.m2/repository/redis/clients/jedis/3.2.0/jedis-3.2.0.jar:/Users/username/.m2/repository/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar:/Users/username/.m2/repository/org/apache/commons/commons-pool2/2.6.2/commons-pool2-2.6.2.jar:/Users/username/.m2/repository/com/alibaba/fastjson/1.2.62/fastjson-1.2.62.jar

二. 双亲委派机制

1. 工作机制

这三种类加载器,是按照双亲委派机制来工作的。

当需要加载一个类时,AppClassLoader会检查是否已加载此类,如果已加载则不再处理,如果没有加载,则会询问ExtClassLoader是否已加载此类。如果ExtClassLoader没有加载此类,会再询问BootstrapClassLoader是否已加载此类。这样一层层往上询问。

如果连BootstrapClassLoader都没有加载过此类,那么BootstrapClassLoader会检查它是否可以加载此类,如果可以,它会记载这个类。如果不能,那么它会往下询问ExtClassLoader是否可以加载,如果能则加载,不能则继续往下询问AppClassLoader。

双亲委派机制

2. 为什么采用双亲委派机制

这种机制能保证系统级别的类不会被用户覆盖,防止危险代码的植入。

相关文章

  • 四、初识ClassLoader

    双亲委派的定义 类加载器的父亲委托机制(双亲委派机制) 类加载器加载一个类时,会优先交给其父的加载器加载,父加载器...

  • 为什么使用双亲委派机制?

    为什么使用双亲委派机制? 专业名词 说双亲委派机制就不得不说类加载器。 引导类加载器:加载%JAVA_HOME%/...

  • 3.手写自己的java类加载器

    类的加载过程?何为双亲委派机制?为啥这么设计?实现一个自己的类加载器?如何打破双亲委派机制? 1.类加载器 jar...

  • Java虚拟机

    JVM 组成部分 类加载器 执行引擎 内存区 本地方法调用 类加载器 双亲委派模型 类的加载过程采用双亲委派机制,...

  • 从类加载开始的JVM学习

    目录 引言 java类加载流程 java类加载机制- 类加载原理- 双亲委派机制 Tomcat中双亲委派机制的应用...

  • 简单了解什么是双亲委派机制?

    什么是双亲委派机制 了解双亲委派,需要先了解下JAVA的类加载器ClassLoader,java的类加载器主要有以...

  • SPI的ClassLoader问题

    问题 为什么说spi服务机制破坏了双亲委派模型? 双亲委派机制 启动类加载器(Bootstrap ClassLoa...

  • 双亲委派机制

    说到双亲委派机制,首先你要了解,什么是类加载器,下面就先简单说一下类加载器,后面在对双亲委派机制进行了解。 一、类...

  • java类的加载机制

    概念 类的生命周期 类加载器 jvm类加载机制 类的加载方式 双亲委派模式

  • JAVA类加载机制

    jvm之java类加载机制和类加载器(ClassLoader)的详解java类加载机制:全盘负责、双亲委派、缓存机...

网友评论

      本文标题:类加载器及双亲委派机制

      本文链接:https://www.haomeiwen.com/subject/qdlljltx.html