自定义classLoader
Posted yangfei629
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义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同步,以此保证加载的线程安全
以上是关于自定义classLoader的主要内容,如果未能解决你的问题,请参考以下文章