Java 类加载器揭秘

作者/分享人:追梦
向 Ta 提问
追梦,某大型互联网公司高级Java攻城狮,热衷并发编程,开源框架,微服务架构设计,业余时间担任并发编程网编辑,CSDN博客专家(https://blog.csdn.net/zhailuxu),微信公众号 :‘技术原始积累’

类加载器作为 JVM 加载字节码到内存中的媒介,其重要性不言而喻,另外在职场面试时候也会被频繁的问道,了解类加载器的原理,能灵活的自定义类加载器去实现自己的功能显得尤为重要。

主要内容:

  • 讲解 Java 中自带的三种类加载器,以及构造原理
  • 讲解类加载器原理
  • 讲解一种特殊的与线程相关类加载器
  • 讲解 Tomcat 框架中多级类加载器的实现原理
  • 讲解如何使用类加载器实现简单的模块间隔离
已有638人预订
预订达标
文章出炉
     
02月04日
02月12日
本场 Chat 文章已出炉,购买后即可阅读文章并获得一张追梦的读者圈Pass
请务必添加GitChat服务号以查看活动进度及获取活动通知。
查看文章评论/提问
wenchao
URL[] moduleUrl = new URL[]{new URL("file://"+ moudle)}; 这个 file:// 好像不对,windows下测试有bug, 可以修改为: File moduleFile = new File(moudle); URL moduleURL = moduleFile.toURI().toURL(); URL[] moduleUrl = new URL[] {moduleURL}; //new URL("file:/" + moudle)
追梦
本文当谈到appclassloader和system classloader时候是说的同一个东西
王斌
厉害!!!
姚小焕
个人对以下这句话意见不一样: “并且我们知道如果一个类由类加载器 A 加载,那么这个类依赖类也是由相同的类加载器加载。那么 Bootstrap ClassLoader 加载了服务提供者在 rt.jar 里面提供的搜索开发商提供的实现类的 API 类(ServiceLoader),那么这些 API 类里面依赖的类应该也是由 Bootstrap CalssLoader 来加载” 举个例子: ```java public static <S> ServiceLoader<S> load(Class<S> service) { ClassLoader cl = Thread.currentThread().getContextClassLoader(); // (1) return ServiceLoader.load(service, cl); } ``` 该方法中(1)即使注释掉,也是可以使用APPClassLoader的: ```java private ServiceLoader(Class<S> svc, ClassLoader cl) { service = Objects.requireNonNull(svc, "Service interface cannot be null"); // (2) loader = (cl == null) ? ClassLoader.getSystemClassLoader() : cl; acc = (System.getSecurityManager() != null) ? AccessController.getContext() : null; reload(); } ``` 因为(2)中就可以直接拿到APPClassLoader了; 个人理解ContextClassLoader()的作用是可以传自定义ClassLoader吧。 请指教~~
姚小焕: gitchat的评论格式无力吐槽。。。
恒DCanon
不错加油
恒恒
加油,支持
小新
项目里面有一点就是在new URLClassLoader的时候,如果是windows系统URL地址要用 file:\\,或者/ 不然就找不到那个类了
你可能还喜欢
哪些算法和数据结构是需要程序员必须掌握的?
zhen.guo
ACT 敏捷教练培养体系
Chat 三人行
Spring Cloud Consul 从入门到精通
如梦技术 dreamlu
Spring Data JPA 晋级提升篇:复杂场景实战用法与优化
张振华
高并发、高性能 Web 架构解决方案
Array老师
程序员的自我进化:学习之道,如何更有效的学习
Soyoger
微信扫描登录