述一场风花雪月

 

聊聊类加载机制

  •  

  • 类加载机制,谈到双亲委派模型后会问到哪些违反了双亲委派模型?为什么?为什么要双亲委派?好处是什么?

 

常见的三种类加载器

 

  启动器 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

 

 

 

 

posted on 2018-07-01 17:00  述一场风花雪月  阅读(362)  评论(0)    收藏  举报

导航