首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java和Java类加载

Java和Java类加载
EN

Stack Overflow用户
提问于 2013-08-13 13:25:19
回答 2查看 4.8K关注 0票数 7

我在Internet上看到的Java和Java类加载的区别是:

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

善意地验证了我的理解.

另外,为什么它在Java中是这样设计的(保持这样做有什么好处)。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-13 13:39:29

好吧那好,

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

  1. 引导类加载器
  2. 扩展类装入器
  3. 系统-类类加载器

到现在为止还好。现在,这适用于单独运行和免费运行的单个应用程序。

但是当你说J2EE时会发生什么呢?您有多个应用程序运行在同一个地方,所以您必须想出一种方法来防止它们之间的绊脚石。这就是这些额外的课堂装载机发挥作用的地方。

考虑一下服务器实例。有一个带有两个部署耳朵的JBoss。如果应用程序之间存在冲突的类,会发生什么情况?他们在自己的特定环境下很好,但总的来说,他们是不一致的。

这些额外的类加载器是以一种应用程序的方式引入的,以确保它们之间的隔离。系统下面的Classloaders --Classpath Classloader只有在一个子类的清单文件中指定了类时才能识别它。

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

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

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

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

在J2EE中没有确定的类加载器结构(供应商拥有实现它的“诗意许可”),但它们有点遵循层次结构。在本例中,System类加载器加载主要应用程序:服务器。因此,由于可见性原则,每个应用程序都可以使用服务器库(更具体地说,是它的类)。

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

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

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

这在一定程度上是正确的,但我宁愿将这种断言限制在应用程序的上下文中,而不包括由顶级类加载器加载的Java相关类。

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

票数 12
EN

Stack Overflow用户

发布于 2013-08-13 13:30:36

我想Java EE class loading standard会在你路上帮你的。据我所知,标准Java没有强制的类加载方式。然而,对于WebApps (WAR),则指定类加载是父-最后加载。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18210389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档