- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我认为我在这里弄错了。
我有一个简单的 servlet
,它带有一个打印一些消息的静态 block 。据我所知,静态 block 应该在 servlet 类首次加载到 jvm 中时处理。
我正在使用嵌入式 jetty
并使用 -verbose:class
jvm 选项启动 jetty 服务器。
我可以在输出中看到 Servlet
类在我第一次访问此 servlet 并查看消息之前很久就已加载。
但据我所知,静态 block 应该在类加载后立即初始化。我哪里错了?
最佳答案
The Java Virtual Machine dynamically loads, links and initializes classes and interfaces. Loading is the process of finding the binary representation of a class or interface type with a particular name and creating a class or interface from that binary representation. Linking is the process of taking a class or interface and combining it into the run-time state of the Java Virtual Machine so that it can be executed. Initialization of a class or interface consists of executing the class or interface initialization method
<clinit>
(§2.9).
最后一部分,<clinit>
, 是你的 static
初始化程序运行。
-verbose:class
简单
Displays information about each class loaded.
因此,您的类作为加载类路径条目的 Web 应用程序的一部分加载,但在 Jetty 实例化它以便它可以使用该对象处理请求之前它不会被初始化。
关于java -详细 :class shows that the servlet is loaded but a static content is initialized only when the servlet is accessed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23066144/
我是一名优秀的程序员,十分优秀!