聊聊类加载机制
- 类加载机制,谈到双亲委派模型后会问到哪些违反了双亲委派模型?为什么?为什么要双亲委派?好处是什么?
常见的三种类加载器
启动器 Bootstrap c++编写的 jvm的一部分 开发者无法直接获取
标准扩展加载器类 Sun java的类库扩展包加载到内存
应用程序加载器 程序的类加载器
特殊的
线程上下文类加载器
继承应用程序加载器的用户自定义加载器
为什么使用?
防止内存中出现多份同样的字节码 、安全性
破坏jvm
第一次 为了兼容
双亲委派模型在jdk1.2的时候才被引入,提供了findClass方法供用户进行重写以指定自己的类加载规则,但是在jdk1.2之前用户继承ClassLoader的目的就是为了重写loadClass方法,但是双亲委派的具体逻辑就实现在这个方法之中,所以在JDK1.2之后就不提倡用户覆盖loadClass方法,而应当把自己得把类加载逻辑卸载findClass方法中,如果父类加载其加载失败会调用自己的findClass进行类的加载,这样就可以保证心写出来的类加载器符合双亲委派模型。
第二次
SPI:JNDI的目的就是对资源进行集中管理和查找,它需要调用独立厂商实现部部署在应用程序的classpath下的JNDI接口提供者(SPI, Service Provider Interface)的代码。
父类加载器请求子类加载器去完成类加载的动作,这已经违反了双亲委派模型的一般性原则,在Java中所有涉及SPI的如jNDI , JDBC , JCE , JAXB和JBI都使用这种模型来进行类的加载。
第三次
osgi 一个模块一个类加载器
另外tomcat 奇特的双亲委派
WebappClassLoader内部重写了loadClass和findClass方法,实现了绕过“双亲委派”直接加载web应用内部的资源,当然可以通过在Context.xml文件中加上开启正统的“双亲委派”加载机制
为什么要这样做?
https://blog.csdn.net/qq_38182963/article/details/78660779
浙公网安备 33010602011771号