2

我有一个 Web 应用程序和两个类文件,

第一类是MyClass.class,它位于 abc.jar 文件 (WEB-INF/lib/abc.jar) 中,第二类是YourClass.class,它位于类文件夹 (WEB-INF/classes/YourClass.class) 中。

我的问题是应用程序启动时首先加载哪个类?为什么?

4

4 回答 4

9

根据我的经验,您无法预测 JVM 加载类的顺序。

一旦我制作了一个测试运行程序(有点像 Maven 的 Surefire)并使用相同的 JVM 和操作系统,它在不同的机器上运行时会以不同的顺序加载类。吸取的教训:

您不应该将应用程序构建为依赖于类加载顺序

于 2009-05-24T17:41:00.440 回答
5

对于“需要”的某些定义,根据需要加载类。加载类的确切时间取决于 JRE 实现、javac 实现、线程到底在做什么、服务器代码,当然还有应用程序代码。在这方面做假设是个坏主意。如果您想查看特定运行会发生什么,您可以使用-verbose:class

于 2009-05-24T17:48:48.833 回答
3

Sun 的类加载器文档总是说 WEB-INF/classes 或 WEB-INF/lib,但没有说首先检查哪个。

来自IBM 文档

“加载类的规则在JVM规范中有详细的说明。基本原则是类只在需要的时候加载(或者至少看起来是这样加载的——JVM在实际加载中具有一定的灵活性,但是必须保持一个固定的类初始化序列)。每个被加载的类可能还有它依赖的其他类,因此加载过程是递归的。”

所以我认为答案是:这取决于你的应用程序首先需要哪些类。

于 2009-05-24T17:36:53.673 回答
1

正如 duffymo 指出的那样,这可能会有所不同。您可以确定此特定应用程序的顺序的一种方法是在类构造函数和 Web Web 应用程序页面加载方法中插入 Response.Write 文本。“A 类中的实例化对象”、“打开的网页 MyPage”等。

一旦你弄清楚了序列,注释掉那些代码,以便你以后可以重用它们来验证你没有做出影响序列的更改(例如提前或稍后实例化对象)。

于 2009-05-24T17:42:24.353 回答