标签:引入 载器 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同步,以此保证加载的线程安全
标签:引入 载器 osg 打破 情况 细节 etc 上下 java
原文地址:https://www.cnblogs.com/yangfei629/p/13205080.html