加入收藏 | 设为首页 | 会员中心 | 我要投稿 淮安站长网 (https://www.0517zz.cn/)- 运营、云管理、经验、智能边缘、云硬盘!
当前位置: 首页 > 移动 > 正文

Java界神秘技术ClassLoader,吃透它看这一篇就够了

发布时间:2019-07-18 22:08:50 所属栏目:移动 来源:Java之高级架构
导读:副标题#e# ClassLoader 是 Java 届神秘的技术之一,无数人被它伤透了脑筋,摸不清门道究竟在哪里。网上的文章也是一篇又一篇,经过本人的亲自鉴定,绝大部分内容都是在误导别人。本文我带读者彻底吃透 ClassLoader,以后其它的相关文章你们可以不必再细看了

在运行之前,我们需要对依赖的类库进行编译:

  1. $ cd ~/source/jcl/v1 
  2. $ javac Dep.java 
  3. $ cd ~/source/jcl/v2 
  4. $ javac Dep.java 
  5. $ cd ~/source/jcl 
  6. $ javac Test.java 
  7. $ java Test 
  8. v1 
  9. v2 
  10. false 

在这个例子中如果两个 URLClassLoader 指向的路径是一样的,下面这个表达式还是 false,因为即使是同样的字节码用不同的 ClassLoader 加载出来的类都不能算同一个类。

  1. depv1Class.equals(depv2Class) 

我们还可以让两个不同版本的 Dep 类实现同一个接口,这样可以避免使用反射的方式来调用 Dep 类里面的方法。

  1. Class<?> depv1Class = v1.loadClass("Dep"); 
  2. IPrint depv1 = (IPrint)depv1Class.getConstructor().newInstance(); 
  3. depv1.print() 

ClassLoader 固然可以解决依赖冲突问题,不过它也限制了不同软件包的操作界面必须使用反射或接口的方式进行动态调用。Maven 没有这种限制,它依赖于虚拟机的默认懒惰加载策略,运行过程中如果没有显示使用定制的 ClassLoader,那么从头到尾都是在使用 AppClassLoader,而不同版本的同名类必须使用不同的 ClassLoader 加载,所以 Maven 不能完美解决钻石依赖。 如果你想知道有没有开源的包管理工具可以解决钻石依赖的,我推荐你了解一下 sofa-ark,它是蚂蚁金服开源的轻量级类隔离框架。

分工与合作

(编辑:淮安站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读