1

これは非常に単純なコードです。

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]
4

2 に答える 2

0

クラス自体は、推移的な方法でクラスをロードできます。プログラムはSystemクラスを利用します。クラス自体は、などのシステムクラスを参照する場合がありますjava.io.Serializable

リスト内のクラスも、非常に頻繁に使用されるクラスです。初期化の遅延を回避するために、仮想マシンがそれらを強制的にロードしている可能性があります。これらのクラスは、重要なプログラムで使用されるようにバインドされています。

于 2013-03-24T19:12:33.510 に答える
0

Javaでは、クラスは少なくとも1つの別のクラス(Objectと呼ばれる)を参照します。JVMは、これらの参照(fe extends、return type、field type、implements)を識別し、参照されたクラスをロードします。

上記の例では:

Java VMに、ロードされていないときにクラスをロードします

package test;
public class Test {
  public static void main(String[] args) {
    System.out.println("test");
  }
}

クラス参照:システム、オブジェクト、クラス、文字列、リフレクションパッケージの一部のクラスなど。

上にリストしたこれらのクラス。

于 2013-03-24T20:07:44.233 に答える