美文网首页我爱编程
Java ClassLoader原理

Java ClassLoader原理

作者: zhyee_yan | 来源:发表于2018-05-04 14:31 被阅读0次

    ClassLoader概念

    ClassLoader是用来动态加载class文件到内存中的机制,程序在启动时,并不会一次性加载所有class文件,而是根据程序的需要,通过类加载机制来动态加载,只有class文件被载入到内存中,才能被其他class所用。

    java默认提供的三个ClassLoader

    • BootStrap ClassLoader

    java类加载层次中最顶层的类加载器,负责加载jdk的核心类库。

    • Extension ClassLoader

    扩展类加载器,负责加载java的扩展类库,默认加载JAVA_HOME/jre/lib/ext/目下的所有jar。

    • App ClassLoader

    系统类加载器,负责加载程序classpath目录下的jar和class文件

    除了这三个类加载器,用户也可以自定义类加载器。自定义的ClassLoader都必须继承java.lang.ClassLoader(包括extension classLoader和app classLoader)。bootstrap ClassLoader除外,jvm启动后bootstrap classLoader也随之启动,加载完核心类库后,负责构造extension classLoader和app classLoader类加载器。

    ClassLoader加载原理

    • 原理

    使用双亲委托模型搜索类:当一个ClassLoader需要加载某个类时,会将这个任务委托给它的父类加载器,这个过程是由上至下的,首先由BootStrap ClassLoader试图加载,未加载到则把任务委托给Extension ClassLoader,依次往下至委托的发起者,如果最终并未搜索到该类,则抛出ClassNotFoundException异常。

    • 优点

    双亲委托模型可以避免重复加载,当父类已经加载过一次,子类就没有必要再加载了。

    • jvm判断

    jvm在搜索类的时候,不仅要判断两个类的类名是否相同,还要判断是否是同一类加载器加载的实例。两者同时满足,则认为这两个类是相同的。

    ClassLoader的加载体系

    1.自底向上检查类是否已加载
    2.自顶向下尝试加载类

    自定义的ClassLoader

    自定义的ClassLoader分两步:
    1.继承java.lang.ClassLoader
    2.重写父类的findClass方法

    点击查看原文

    相关文章

      网友评论

        本文标题:Java ClassLoader原理

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