这是一个非常简单的代码:
package test;
public class Test {
public static void main(String[] args) {
System.out.println("test");
}
}
我运行它:java -verbose:class Test,以下是输出。为什么要加载这么多类?是不是需要Java加载类?
[Opened C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.Object from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.io.Serializable from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.Comparable from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.CharSequence from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.String from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.reflect.GenericDeclaration from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.reflect.Type from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.reflect.AnnotatedElement from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.Class from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.Cloneable from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.ClassLoader from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.System from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.Throwable from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.Error from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
...
test
[Loaded java.lang.Shutdown from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.Shutdown$Lock from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
答案 0 :(得分:0)
类本身可以以传递方式加载类。您的程序使用System
类,它本身可以引用像java.io.Serializable
这样的系统类。
列表中的类也恰好是非常频繁使用的类。可能只是虚拟机强行加载它们,以避免延迟初始化。这些类必然会在任何非平凡的程序中使用。
答案 1 :(得分:0)
在java中,一个类至少引用另一个类(称为Object)。 JVM识别这些引用(例如,extends,return type,field type,implements)并加载引用的类。
在上面的例子中:
到Java VM在未加载时加载类
package test;
public class Test {
public static void main(String[] args) {
System.out.println("test");
}
}
你的班级参考: 系统,对象,类,字符串,反射包中的一些类等等。
您在上面列出的这些课程。