码迷,mamicode.com
首页 > 其他好文 > 详细

自定义classLoader

时间:2020-06-28 22:26:43      阅读:64      评论:0      收藏:0      [点我收藏+]

标签:引入   载器   osg   打破   情况   细节   etc   上下   java   

一、类的双亲委托


技术图片

 

 

 

  • 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

标签:引入   载器   osg   打破   情况   细节   etc   上下   java   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!