4

次の点については明確ではありません
。クラスは必要に応じて JVM によってロードされます。遅延初期化のようですよね?
クラスが実際にファイル システムにないクラスのクラスを実行する場合 (たとえば、A削除importBれたか、配信されなかった、または何らかの理由で) 、クラスのメソッドが呼び出されない場合、クラスはロードされて実行されますか? または、インポートを解決できないため、クラスをまったく実行できませんか? または、クラスがロードされ、特定のポイントまで実行されますか? BB.class
AB
A
A

4

2 に答える 2

7

importステートメントはコンパイラーにとってのみ重要です。バイトコードでは、他のクラスへのすべての参照は完全に修飾されています。そのため、実行時に余分なインポートは重要ではありません。

あなたの場合、JVMはロードと検証に必要なすべてのクラスをロードしようとしますAB、したがって、すぐにロードしようとします、ただし、依存クラスは必要な場合にのみ遅延ロードされます。次の例を確認してください。

public class A {

    public static void bar() {
        new B().foo();
    }

    public static void main(String[] args) {
        //bar();
    }

}

コンパイルA.javaして削除しB.classます。メソッドを呼び出さなくてもbar()、プログラムは問題なく実行されます。しかし、実際にクラスを使用してコードのコメントを外すとB、厄介になります。

Exception in thread "main" java.lang.NoClassDefFoundError: B
    at A.bar(A.java:4)
    at A.main(A.java:8)
Caused by: java.lang.ClassNotFoundException: B
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    ... 2 more

利用できない場合は、または同様のものBを取得します。NoClassDefFound

于 2012-09-26T07:21:35.703 に答える