线程上下文类加载器,tomcat服务器类加载机制和OSGI技术模块开发原理
线程类加载器就是为了抛弃双亲委派模式,oracle官方设计接口,(一般都在扩展类加载器里)而实现类由第三方实现,就会发生在扩展类加载器加载接口的时候需要加载对应的实现类,但是这个实现类由第三方实现,并不在同一个地方,导致出现问题,通过线程类加载器(默认使用app加载器)可以设置类加载器,在设置的类加载器里面可以通过逻辑修改代码从而抛弃双亲委派机制
package cn.com.lodar;
public class TestThreadLoader {
public static void main(String[] args) throws ClassNotFoundException {
ClassLoader loader = TestThreadLoader.class.getClassLoader();
System.out.println(loader);
//获得线程上下文加载器
ClassLoader loader1 = Thread.currentThread().getContextClassLoader();
System.out.println(loader1);
//更改加载器
Thread.currentThread().setContextClassLoader(new FileSystemClassLoader("F:/myjava"));
System.out.println(Thread.currentThread().getContextClassLoader());
Class<?> c = Thread.currentThread().getContextClassLoader().loadClass("cn.com.lodar.Demo01");
System.out.println(c);
System.out.println(c.getClassLoader());
}
}
tomcat服务器不使用系统默认的类加载器,但是也是用了代理模式,每一个Web应用都有一个对应的类加载器实例,它会首先去自己加载这个类,如果找不到,再代理给父类加载器目的也是为了保证安全
OSGI是面向Java的动态模块系统,为开发人员提供面向服务和基于组件的运行环境,将不同的组件整合到一个系统里面,比如A,B,C三个组件,每个组件都有自己的类加载器,用来加载自己的类,在加载Java的核心类时,代理给其父类加载器加载,一般是启动类加载器来完成,在这些组件里,都包含了Java包和类,某个组件可以声明导出自己的类和包,让其它组件使用,如果其它的组件使用了导出的类和包时,它会代理给导出这个类或者包的组件进行加载,并不会自己加载