当前位置: 首页 > 面试题库 >

Java EE和Java SE类加载

裴彦
2023-03-14
问题内容

我在html" target="_blank">Internet上阅读的Java EE和Java SE类加载之间的区别在于:

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

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

请确认我的理解。

另外,为什么要在Java EE中如此设计(保持这种优势的任何优势。)

这是我听到此链接的链接


问题答案:

那好吧

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

  1. 引导类加载器
  2. 扩展类加载器
  3. 系统类路径类加载器

到目前为止,一切都很好。现在,这适用于 单独 运行且免费运行的 单个 应用程序。

但是,当您说 J2EE时会 怎样?您有 多个应用程序 在同一个地方运行,因此您必须找出一种防止它们 相互绊倒
的方法。这就是这些额外的类加载器的作用。

考虑一个服务器实例。有一个带有两个已部署EAR的JBoss。如果 应用程序之间的类冲突,
将会发生什么?他们在自己的特定上下文中可以接受,但总体上并不一致。

这些额外的类加载器以应用程序方式引入,以 确保它们之间的隔离System-Classpath的类加载器
只有在清单文件中为其子级之一指定的类时, 类加载器才 识别类。

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

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

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

没错,由于上述原理

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

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

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

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

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

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



 类似资料:
  • 本文向大家介绍Java加密解密工具(适用于JavaSE/JavaEE/Android),包括了Java加密解密工具(适用于JavaSE/JavaEE/Android)的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了一个适用于JavaSE/JavaEE/Android的Java加密解密工具,供大家学习,具体内容如下 以上就是本文的全部内容,希望对大家学习java程序设计有所帮助。

  • 我想了解如何使用Spring容器的ClassLoader。 下面是一个例子:部署一个包含所有必要的罐的WAR,以便在tomcat的网络容器中启动Spring容器。 我的问题是: 1。我认为Spring容器类本身是由web容器创建的WAR类加载器加载的,对吗 2。取消部署WAR时,spring容器加载的类[](java.lang.Class对象)是如何卸载的。spring本身有一个类加载器吗?还是使

  • 我不确定我遇到的问题是概念问题还是技术问题,因为配置错误。 目标是在应用程序容器中托管的Java EE应用程序(特别是WildFly)和独立运行的Java SE应用程序之间发送双向消息,都使用标准JMS协议和主题。我认为这应该是可能的,只要他们都使用相同的经纪人和相同的主题。 因此,我有一个外部 Artemis 实例作为消息代理运行,并在 Java EE 应用程序的单独 Bean 中成功设置了生产

  • Tephra旨在构建一个稳定、高效、易于集群、快速扩展的JavaEE开发框架。目前,Tephra已经具备了以下特性: 提供类级别的热更新,但仅建议在需要快速修正严重BUG、并且无法立即进行全更新时使用。 提供全冗余方式的缓存,自动在每个节点间同步缓存数据,而每个节点都仅从本地内存中获取缓存数据,从而提供高效的执行效率,并且当部分节点宕机时仍旧能正常提供服务。当然,也允许使用Redis提供统一的中心

  • JBoss-javaee-specs 即 JBoss JavaEE Specs APIs。这个项目提供了一套完整 APIs 所需的依赖管理关系,且此依赖关系由 Java EE 平台规范定义的。 采用的命名规范如下: groupId:    org.jboss.spec + the package name artifactId: Technology-api_SpecVersion_spec ve

  • 我的servlet: 根据一个教程,当我在jsp页面中单击to按钮时,它将触发Servlet类中的doPost()方法。 但是,我一直得到HTTP状态404-/login.do错误 我有这个pom.xml

  • 问题内容: 我正在编写一个使用GWT,Hibernate和Google Guice(带有GIN)的相当简单的应用程序。我想做的是使用外部管理器(例如在Spring中使用)来管理事务 ,而不是使用。我尝试使用,但似乎不适用于我。 我已经使用注入了EntityManager ,如下所示: 手动管理事务时,它似乎可以正常工作。我希望自动管理事务,也希望使用DBUnit进行自动化测试。 有人知道如何解决吗

  • 我了解到CDI Beans可以在不同的基于Web应用程序的作用域中使用(只有在那里,对吗?)。例如:@quiestScoped、@SessionScoped等等。@SessionScoped在整个浏览器会话中保存托管bean中的数据。这在逻辑上听起来很安静,因为注释名称描述了它的功能。然而-现在我仔细查看了EJB会话bean。到目前为止,我知道这样一个人可能有三种状态之一:无国籍、有州和单身。对我