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二进制信息
原文地址:https://www.cnblogs.com/LQBlog/p/9200926.html