首页 > 其他 > 详细

自定义classLoader

时间:2020-06-28 22:45:48      阅读:66      评论:0      收藏:0      [点我收藏+]

一、类的双亲委托


技术分享图片

 

 

 

  • Bootstrap(启动)类加载器,它负责加载 <Java_Runtime_Home>/lib下面的类库加载到内存中,由于启动类加载器涉及到虚拟机底层实现细节,开发者无法直接拿到其引用,因此使用Class.getClassLoader() 的结果为 null,因此如果获取的ClassLoader为null,则可能是启动类加载器所加载,无父类

  • Extension(扩展)类加载器,负责加载 <Java_Runtime_Home>/lib/ext下面的类库加载到内存中,其父类是ClassLoader

  • System(系统)类加载器,负责将系统类路径中的指定的类库(即项目中引入的包)加载到内存中,其父类是ClassLoader

 

二、自定义ClassLoader


自定义ClassLoader一般重写findClass方法(父类的ClassLoader的loadClass方法有双亲委托逻辑,一般不重写)

 

findClass方法:加载指定位置的文件,最终由默认的defindClass转换class字节数组到Class对象

 

三、破坏双亲委托


一般类加载有下到上层层委托,子classloader委托父classLoader加载。父classloader不用感知子classloader (这里的父亲关系 只是保持一个引用,并非类的extends关系)

但有些情况需要打破这个关系,如SPI机制(JDBC),具体的实现是由子加载器加载,此时需要父classloader使用子classloader加载具体的实现类(通过上下文加载器来获取子classloader)。

一般我们自定义的classloader默认的上下文classloader是父classloader(即systemClassLoader)

其他:如OSGI机制 tomcat自定义classLoader实现web应用隔离。

 

四、类加载的并发安全


JVM中ClassLoader已经通过synchronized同步,以此保证加载的线程安全

 

自定义classLoader

原文:https://www.cnblogs.com/yangfei629/p/13205080.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!