既然是简述,就说的简单一点了,因为 Java 的类加载是一个很大的话题。很多技术,例如 Java EE 容器、OSGi 容器、JVM 上面的动态语言,都有自己在类加载上的特殊之处。
JVM 的类加载
<br/> 先回顾一下 JVM 类加载的基本知识点:
- 代理模式<br/>

从上面的这个图我们可以看到,类加载器在加载某个类的时候会先将加载请求提交给它的父加载器,逐级上交。如果出于最根部的 Bootstrap Classloader 不能加载此类,类的加载请求会逐级向下传递,直到那个能加载到这个类的类加载器。
这么做的原因在于,我想,没有人会希望下面这个情况的发生。像 JDK 中的那些公用的类,同一个类会因为被不同的类加载器加载,而被认为是不同的类。同时,公用的类被多次加载也是对资源的浪费。
- 类的可见性<br/> 这一点简单来说就是父类加载到的类对子类是可简单,反之不成立。
Java EE 容器的类加载
<br/> Java EE 应用常以 EAR 格式来部署,这种格式也相较于 WAR 复杂,所以就只以 EAR 为例介绍了。
EAR 包中可以存在一个或多个 EJB-JAR 包和同样可以一个或多个的 WAR 包。EAR 包在 Java EE 容器中会有自己的类加载器,同时 EJB-JAR 和 WAR 也有自己的类加载器。EAR 包的类加载器会是 其 EJB-JAR 包和 WAR 包类加载器的父加载器。如果 WAR 包依赖某个 EJB-JAR 包,那这两者的类加载器会成父子关系。
JBoss AS 7 的类加载的小特殊
<br/> JBoss AS 7 在默认的配置下,其类加载机制和上述 Java EE 容器的类加载有所不同。默认情况下,JBoss AS 中一个 EAR 包的 WAR 和 EJB-JAR 的类加载器对互相的类都是可见的。这个配置可以通过修改 standalone.xml 来实现,加入如下配置:
<!-- lang: xml -->
<subsystem xmlns="urn:jboss:domain:ee:1.0" >
<ear-subdeployments-isolated>false</ear-subdeployments-isolated>
</subsystem>
最后
<br/> Java EE 容器的类加载并没有严格规范,具体实现是交由容器自己来做的,所以不同的容器在实现细节上会有不同。希望各位看客可以提供补充。
参考
来源:oschina
链接:https://my.oschina.net/u/1158769/blog/150422
