假设我具有以下项目结构:
Inst.java
import java.lang.instrument.Instrumentation;
final public class Inst {
private static Instrumentation instrumentation;
public static void premain(String args, Instrumentation inst) {
instrumentation = inst;
}
public static long sizeof(Object o) {
return instrumentation.getObjectSize(o);
}
}
Constants.java
public class Constants {
public static final int MAX_LENGTH = 10;
}
SomeClass.java
public class SomeClass {
private int myVar;
public SomeClass(final int myVar) {
this.myVar = myVar;
}
public static class StaticClass {
private static final int SOME_VAR = 1;
}
}
Main.java
public class Main {
public static void main(String [] args) {
int init = Constants.MAX_LENGTH;
SomeClass clazz = new SomeClass(init);
}
}
Oracle文档声明以下内容:
Java虚拟机(JVM)初始化后,将按照指定代理的顺序调用每个premain方法,然后将调用实际的应用程序main方法。
在我看来,这意味着在初始化JVM之后,[[立即]]会调用premain
方法,因此,在此示例中,首先会初始化Inst
。另外,据我所知,static
是在加载类时或更普遍地在对类的第一次引用时初始化的。
因此,在此示例中,初始化和执行顺序如下:
premain()
main()
被称为应用程序的入口点Constants.MAX_LENGTH
被初始化(在main中引用)StaticClass
被初始化(由于创建了外部类的实例)SomeClass
的实例Constants.MAX_LENGTH
类中的Inst
?我会收到运行时错误吗?main()
之前,先加载Constants
,然后加载SomeClass
。