在Java中,所有类在第一次使用类时动态加载到JVM中。
这是否意味着如果我在我的源文件中有类并且我没有对它进行任何引用,那么它的Class
对象没有被创建(即没有创建.class
文件)?
在下面的示例代码中,iam没有引用test3
类,但仍会创建其类对象。
class test1 {
static {
System.out.println("static block of test1");
}
}
class test2{
static {
System.out.println("static block of test2");
}
}
class test3 {}
class MyExample1 {
public static void main(String ...strings ) {
new test1();
new test2();
}
}
为什么创建test3.class
文件?
答案 0 :(得分:6)
.class 文件是在编译时创建的。但是,它将通过首次使用(可能)从 .class 文件加载。
在没有 .class 文件的情况下从哪里加载?)
答案 1 :(得分:1)
您必须区分文件 test3.class
(由编译器创建)和类{{的类对象 test3.class
1}},在类加载器加载类时在运行时创建。
如果您使用其中的类编译test3
源文件(编译单元),则始终会创建类文件(通常是.java
,但它也可以是如果该类不是公共的,则命名其他任何东西) - 或者如果该类被另一个已编译的类使用则隐含地命名。
类对象是在首次加载类时由类加载器创建的 - 只要需要或更早时就会发生这种情况。普通class3.java
从具有相同名称的文件加载您的类,但原则上,数据也可以动态生成,从数据库或类似文件加载。
然后通过调用URLClassLoader
块来初始化它(类)。 (初始化是第二步,不一定是同时进行,但两者都在你第一次使用该类之前。)