JavaEE和JavaSE类加载

JavaEE和JavaSE类加载,java,classloader,Java,Classloader,我在互联网上看到的JavaEE和JavaSE类加载之间的区别是 在JavaSE中,类装入器将类装入委托给其父类 然后尝试加载类本身 然而,在JavaEE中,类加载器首先尝试加载类本身,然后 将该类的类装入委托给其父类装入器 请验证我的理解。 另外,为什么它在JavaEE中设计成这样(保持这样有什么好处。) 这是我听到的链接[http://www.youtube.com/watch?v=t8sQw3pGJzM]我想这会对你有所帮助。据我所知,标准Java没有强制的类加载方式。但是,对于WebApp

我在互联网上看到的JavaEE和JavaSE类加载之间的区别是

在JavaSE中,类装入器将类装入委托给其父类 然后尝试加载类本身

然而,在JavaEE中,类加载器首先尝试加载类本身,然后 将该类的类装入委托给其父类装入器

请验证我的理解。

另外,为什么它在JavaEE中设计成这样(保持这样有什么好处。)

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

我想这会对你有所帮助。据我所知,标准Java没有强制的类加载方式。但是,对于WebApps(WARs),指定类加载是父类最后一次加载。

好吧

一个通用应用程序有3个标准类加载器:

  • 引导类加载器
  • 扩展类加载器
  • 系统类路径类加载器
  • 到目前为止,一切顺利。现在,这适用于单独免费运行的单个应用程序

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

    考虑一个服务器实例。有一个JBoss有两个耳朵。如果应用程序之间存在冲突的类,会发生什么情况?它们在各自特定的环境下是可以的,但总体上是不一致的

    这些额外的类加载器是以应用程序方式引入的,以确保它们之间的隔离。仅当在清单文件中为某个类的子类指定了类时,系统类路径类加载器下面的类加载器才能识别该类

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

  • 委托:如果未加载类(缓存),则将请求委托给其父级。这一直持续到层次结构的顶部(引导类加载器),它加载基本的J2SE相关类(即
    Integer
    ArrayList
    ,等等)。这就是您在问题中提到的:类加载器将加载委托到层次结构的顶部,然后如果父类找不到类,则每个类加载器将尝试加载该类,直到有人加载它。否则:ClassNotFound。
  • 可见性:父类加载器加载的类对其子类可见,而不是相反
  • 唯一性:如果父类加载器加载一个类,子类将永远不会重新加载它
  • 在JavaSE中,类加载器将类加载委托给其父类加载器,然后尝试加载类本身

    根据上述原则,这是正确的

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

    在那里,应用程序有特定的类加载器结构,但作为一个整体,它们是系统类路径类加载器的不同子类。每个应用程序都加载其相关的和特定的类(应用程序和库)

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

    然而,在JavaEE中,类加载器首先尝试加载类本身,然后将该类的类加载委托给其父类加载器

    这在一定程度上是正确的,但我宁愿将这种肯定限制在应用程序的上下文中,而不考虑与Java相关的类,它们确实是由顶级类加载器加载的


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

    相关(但如果你发现一个地方说上面描述的顺序是强制的,请包含链接。因此答案似乎不一致)。@Gamb我已经浏览了这个链接。但我没想到。但仍然存在一种混乱。顺便说一句,谢谢你分享这个链接。所以你同意我说的。。在J2EE和J2SE中,类加载器的行为是相反的。实际上是的,除了EE规范没有规定任何东西,只是它是以这种方式实现的。我的问题有些不同,我已经知道J2SE类加载,但它与J2EE类加载是否不同。这就是我的问题所在。谢谢。@John我理解你的问题,这就是为什么我描述了两者之间的区别。当然,它们是不同的,在J2EE环境中,您必须确保应用程序隔离。严格来说,它们是不同的,因为它们以不同的方式处理类加载(J2EE涉及更多的类加载程序,处理方式也不同)。好的,这很好,但是您没有提到J2SE和J2EE中类加载的顺序,我想问的主要是这个问题。@johnyou问:请验证我的理解,还有:为什么在javaee中设计成这样(保持这样有什么好处?)。我试图通过描述过程把两个答案融合成一个。不用担心,我会用更简单、更明确的术语来解释。系统类路径类加载器和应用程序特定类加载器之间是否有共享的类?