jvm学习-ClassLoader(二)

ClassLoader结构

jdk加载的4个步骤

       CustomClassLoader 用户自定义的classLoader

       APPClassLoader主要加载classPath下面的class

       Extension ClassLoader 主要负责加载JAVA_HOME/jre/lib/ext/目下的所有jar

       BootStrap ClassLoader:负责加载JDK中的核心类库,如:rt.jar、resources.jar、charsets.jar等

java类加载器采用双亲委托模式

                 则是从下级往上级询问是否有加载。如果没加载 再从上级往下下级查找 如果找到就加载 没有找到就继续向下询问

                 比如 在程序创建一个Test类。然后在main方法打印这个这个Test类的classLoader 会打印 APPClassLoader

                          因为appClassLoader会逐个向上询问是否加载  则都没有加载  然后从上级bootstrap到Extension ClassLoader会在他的扫描的jar里面找有没有Test这个class都没有找到 最终APPClassLoader在classPath找到这个类  加载

                 我们改变一下程序 将Test类打包成一个jar 放到ext目录下

                       再次打印则会输出加载类是Extension ClassLoader

双亲委托模式的好处

             1. 防止重复加载

缺点 :

          上层类加载器无法获得下层类加载器加载的类

双亲委托模式是jdk的默认实现 但是不一定要完全按照这个模式

         比如tomcat webappClassLoader 就会先加载自己的class  找不到再委托父类

自定义ClassLoader 必须继承 classLoader类

   classLoader的重要方法

                    loadClass(String name)文件名字

             defineCalss(byte[] b int off,int lent) class文件的内容
        findClass() loadClass会掉findClass方法
        findLadedClass(String name) 如果加载了 则不加载 没加载 才加载
为什么要重写classLoader
     因为默认实现的几种classLoader只会加载特定路径下面的class     我们往往会根据需求加载别的路径下的class 比如网络请求的class二进制信息

猜你喜欢

转载自www.cnblogs.com/LQBlog/p/9200926.html