JAVA SPI, 与contextClassLoader 如何破坏双亲委派机制

参考:

                https://zhuanlan.zhihu.com/p/375952538

                https://www.jianshu.com/p/5d7a72427679

1:双亲委派机制中 bootstrapClassLoader(引导类) 与EXTCL(额外),applicationClassLoader(系统类) 中的意义与类加载流程
         ①: 每个ClassLoader都只能加载自己所绑定目录下的资源;

         ②:在原有加载机制下:类与依赖类都将由同一个类加载器完成

 我们在Application加载类的时候可以选的:

   1. 系统类加载器SystemClassLoader,可通过ClassLoader.getSystemClassLoader()获得;

   2. 当前ClassLoader:加载了当前类的ClassLoader;

   3. 线程上下文类加载器ContextClassLoader:Thread.currentThread().getContextClassLoader();

   4. 自定义类加载器;

但是对于SPI机制,接口类都是通过bootstrapClassloader加载,但是其实现类在classpath下,将无法找到实现类完成加载;

所以此时有两个办法:告诉当前的方法使用哪个类加载器去完成加载实现类的加载,比如作为参数传入,或者将其设置为当前线程的contextClassloader;

具体工作将由Class.forName(target.class, boolean,  contextClassLoader)完成对类的加载;

            具体实现流程可参考: DriverManager.getConnection

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容