次の点については明確ではありません
。クラスは必要に応じて JVM によってロードされます。遅延初期化のようですよね?
クラスが実際にファイル システムにないクラスのクラスを実行する場合 (たとえば、A
削除import
さB
れたか、配信されなかった、または何らかの理由で)
、クラスのメソッドが呼び出されない場合、クラスはロードされて実行されますか? または、インポートを解決できないため、クラスをまったく実行できませんか? または、クラスがロードされ、特定のポイントまで実行されますか? B
B.class
A
B
A
A
質問する
291 次
2 に答える
7
import
ステートメントはコンパイラーにとってのみ重要です。バイトコードでは、他のクラスへのすべての参照は完全に修飾されています。そのため、実行時に余分なインポートは重要ではありません。
あなたの場合、JVMはロードと検証に必要なすべてのクラスをロードしようとしますA
、ただし、依存クラスは必要な場合にのみ遅延ロードされます。次の例を確認してください。B
、したがって、すぐにロードしようとします
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 に答える