Java 类加载器揭秘

作者/分享人:追梦
向 Ta 提问
追梦,某大型互联网公司高级Java开发工程师,并发编程网编辑;热衷并发编程,微服务架构设计,中间件基础设施

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

主要内容:

  • 讲解 Java 中自带的三种类加载器,以及构造原理
  • 讲解类加载器原理
  • 讲解一种特殊的与线程相关类加载器
  • 讲解 Tomcat 框架中多级类加载器的实现原理
  • 讲解如何使用类加载器实现简单的模块间隔离
已有782人预订
预订达标
文章出炉
     
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)
小新
项目里面有一点就是在new URLClassLoader的时候,如果是windows系统URL地址要用 file:\\,或者/ 不然就找不到那个类了
荣思敏: 我说怎么一直报找不到该类的异常呢
追梦
本文当谈到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
不错加油
恒恒
加油,支持
你可能还喜欢
基于深度学习的计算机视觉技术在无人驾驶中的应用
美团技术团队
1小时搞懂 Git 版本控制
Fengy
AutoML 在推荐系统中的应用
第四范式技术团队
Kibana Canvas 初探
medcl
今夜,我们聊聊中国的开源
开源社
统一认证与授权在微服务架构中的设计与实战
CANGWU
微信扫描登录