Java EE和Java SE类加载

时间:2013-08-13 13:25:20

标签: java classloader

我在互联网上阅读的Java EE和Java SE类加载的区别在于

  

在Java SE中,类加载器将类加载委托给其父级   classloader然后尝试加载类本身

     

但是,在Java EE中,类加载器首先尝试加载类本身然后   将该类的类加载委托给其父类加载器。

请确认我的理解。

另外,为什么它的设计与Java EE中的设计相同(保持这种优势的任何优点。)

这是我听到的链接[http://www.youtube.com/watch?v=t8sQw3pGJzM]

2 个答案:

答案 0 :(得分:11)

好吧,

一个常见的应用程序有3个标准的类加载器:

  1. Bootstrap Classloader
  2. 扩展程序类加载器
  3. System-Classpath Classloader
  4. 到目前为止,这么好。现在,这适用于单独运行且免费运行的单个应用程序。

    但是当你说 J2EE 时会发生什么?您有多个应用程序在同一个地方运行,因此您必须找到一种方法来阻止它们相互绊倒。这就是这些额外的类加载器发挥作用的地方。

    考虑服务器实例。有一个JBoss有两个部署的EAR。如果应用程序之间存在冲突的类会发生什么?他们对自己的特定背景感到满意,但总的来说它们是不一致的。

    这些额外的类加载器以应用程序方式介绍,以确保它们之间的隔离 System-Classpath Classloader 下面的类加载器仅在类的子文件清单文件中指定时才识别类。

    在J2SE中,三个基本的类加载器基于三个原则在父子关系中工作:

    1. 委派:如果未加载类(缓存),则将请求委托给其父级。这一直持续到层次结构的顶层( Bootstrap 类加载器)加载基本的J2SE相关类(即IntegerArrayList等等)。这是您在问题中引用的内容:类加载器将加载委托给层次结构的顶部,然后每个类加载器尝试加载类,如果其父级无法找到它,直到有人加载它。否则:ClassNotFound。
    2. 可见性:父类加载器加载的类对其子项是可见的,而不是相反。
    3. 唯一性:如果父类加载器加载了一个类,则子项永远不会重新加载它。
    4.   

      在Java SE中,类加载器将类加载委托给其父类加载器,然后尝试加载类本身。

      是的,由于上面解释的原则。

      J2EE中没有确定的类加载器结构(供应商有“诗歌许可”来实现它),但它们遵循层次结构。在这种情况下, System-classpath 类加载器加载主应用程序:服务器。由于可见性原则,服务器库(更具体地说,它们的类)可用于每个应用程序。

      在那里,应用程序具有特定的类加载器结构,但总体而言,它们是 System-classpath类加载器不同子项。每个应用程序都加载其相关的特定类(应用程序和库)。

      此处的加载不会传播到应用程序上下文之外的父项。为什么?因为如果 System-classpath 类加载器像往常一样加载应用程序,由于可见性原则,每个应用程序的类对其他应用程序都是可见的,完全打破了它们之间的隔离。所以:

        

      但是,在Java EE中,类加载器首先尝试加载类本身,然后将该类的类加载委托给其父类加载器。

      这部分是正确的,但我宁愿将这种肯定限制在应用程序的上下文中,而忽略了Java相关的类,这些类确实是由顶级类加载器加载的。

      长话短说:这不是一个简单的过程,但我不会说J2EE在J2SE的相反方式处理类加载。

答案 1 :(得分:1)

我认为Java EE class loading standard会帮助你。据我所知,标准Java没有强制的类加载方式。但是,对于WebApps(WAR),指定了类加载是父级的。