我有一个 Web 应用程序和两个类文件,
第一类是MyClass.class,它位于 abc.jar 文件 (WEB-INF/lib/abc.jar) 中,第二类是YourClass.class,它位于类文件夹 (WEB-INF/classes/YourClass.class) 中。
我的问题是应用程序启动时首先加载哪个类?为什么?
我有一个 Web 应用程序和两个类文件,
第一类是MyClass.class,它位于 abc.jar 文件 (WEB-INF/lib/abc.jar) 中,第二类是YourClass.class,它位于类文件夹 (WEB-INF/classes/YourClass.class) 中。
我的问题是应用程序启动时首先加载哪个类?为什么?
根据我的经验,您无法预测 JVM 加载类的顺序。
一旦我制作了一个测试运行程序(有点像 Maven 的 Surefire)并使用相同的 JVM 和操作系统,它在不同的机器上运行时会以不同的顺序加载类。吸取的教训:
您不应该将应用程序构建为依赖于类加载顺序
对于“需要”的某些定义,根据需要加载类。加载类的确切时间取决于 JRE 实现、javac 实现、线程到底在做什么、服务器代码,当然还有应用程序代码。在这方面做假设是个坏主意。如果您想查看特定运行会发生什么,您可以使用-verbose:class
正如 duffymo 指出的那样,这可能会有所不同。您可以确定此特定应用程序的顺序的一种方法是在类构造函数和 Web Web 应用程序页面加载方法中插入 Response.Write 文本。“A 类中的实例化对象”、“打开的网页 MyPage”等。
一旦你弄清楚了序列,注释掉那些代码,以便你以后可以重用它们来验证你没有做出影响序列的更改(例如提前或稍后实例化对象)。