質問
ときJVMが次のコードを実行します
MyObject o=new MyObject() //first access MyObject
私たちは、JVMがMyObjectにの負荷クラスを開始することを知っている、しかし、私はJVMがMyObjectにはロードされていません知っているか疑問に思います。
動機
JVMがこれらのコードを実行している場合ので、私は知っているだろう
public class Main{
public static void main(){
ClassLoader myLoader = new ClassLoader(null) {
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
// omitted here
}
}
myLoader.loadClass("MyObject"); //#1
MyObject o=new MyObject() //#2
}
}
我々は、#1せずに、MyObjectには、クラスのメインのクラスローダによってロードされることを知っているが、#1で、MyObjectをの意志クラスは#2にロードされ、そしてどのようにJVMが裁判官になりますか?
それぞれがClassLoader
、それは、これまでロードされたクラスのリストを保持します。
二つの異なる場合はClassLoader
、同じ名前の負荷Aクラス、これらは、2つの別々の無関係なクラスとしてランタイムによって処理されます。それは、同じクラスの異なるバージョンが実行時に共存させることができますので、それは便利です。例えば、我々は、彼らが使用するライブラリのバージョンを調整するから、様々なアプリケーションの開発者を解放し、同じJVM、独自のライブラリとのそれぞれに異なるチームによって開発されたいくつかのWebアプリケーションをデプロイすることができます。
あなたのケースでは、我々がしなければnew MyObject()
、クラスにMain
ロードされたクラスがあること、クラスローダMain
の負荷クラスに頼まれますMyObject
。それは、システムのClassLoader
あなたの何をknownsありません、myLoader
。そのため、システムクラスローダは、クラスをロードしますMyObject
再び。
あなたはMyObjectにへの静的初期化子を追加することでこれを確認することができます:
class MyObject {
static {
System.out.println("class MyObject has been loaded");
}
}