java -verbose:class 显示 servlet 已加载,但仅在访问 servlet 时才会初始化静态内容

use*_*356 5 java servlets classloader

我想我在这里弄错了。

我有一个简单的servlet静态块,可以打印一些消息。据我了解,当 servlet 类首次加载到 jvm 中时,应该处理静态块。

我正在使用嵌入式jetty并使用 jvm 选项启动 jetty 服务器-verbose:class

我可以在输出中看到该类在Servlet我第一次访问此 servlet 并查看消息之前很久就已加载。

但据我了解,静态块应该在类加载后立即初始化。我这里哪里错了?

Sot*_*lis 5

Java语言规范指出

\n\n
\n

Java 虚拟机动态加载链接初始化类和接口。加载是查找具有特定名称的类或接口类型的二进制表示并从该二进制表示创建类或接口的过程。链接是获取类或接口并将其组合到 Java 虚拟机的运行时状态以便执行的过程。类或接口的初始化包括执行类或接口初始化方法<clinit>(\xc2\xa72.9)。

\n
\n\n

最后一部分,即运行初始化程序的<clinit>地方。static

\n\n

您使用的java启动器选项

\n\n
-verbose:class\n
Run Code Online (Sandbox Code Playgroud)\n\n

简单地

\n\n
\n

显示有关加载的每个类的信息。

\n
\n\n

因此,您的类作为加载类路径条目的 Web 应用程序的一部分进行加载,但在 Jetty 实例化它以便可以使用该对象来处理请求之前,它不会被初始化。

\n