自定义classLoader

一、类的双亲委托


 

 

 

  • 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同步,以此保证加载的线程安全

 

posted @ 2020-06-28 21:14  蓝天随笔  阅读(954)  评论(0编辑  收藏  举报