VMクラスローディング機構---クラスローダ

クラスローダ

  「クラスのロード・フェーズの完全修飾クラス名を通じて、バイナリバイトストリームの説明については、 Java仮想マシンを達成するために、外部に、このアクション」。呼ばれるこの操作コードモジュールを達成するには、「クラスローダ」を

クラスとクラスローダー

  これは二つのクラス、必要性に等しい等しいクラス自体、及びそれをロードするクラスローダを使用して実施し、各クラスローダは持っているので、別のクラスの名前空間を

  ここ等しい、クラスを含むオブジェクトのクラスが等しい()メソッドIsAssignableFrom()メソッドはでisinstance()メソッドは、使用含まれ、真の値を返すinstanceofのキーワードオブジェクトが関係決意の結果が真で行う所属します。

分類クラスローダ

Java仮想マシンが関係しているの観点から、2つだけ異なるクラスローダがあります。

  • クラスローダを起動(ブートストラップClasssLoader)使用C ++をリアライズは、それが仮想マシンの一部です。
  • 他のすべてのクラスローダ Javaで実装は、仮想マシンの独立した、抽象クラスjava.lang.ClassLoaderのから継承されました。

Java開発者の視点から見ると、クラスローダは、より詳細に分けることができます。

  • ブートローダークラス:このクラスローダはに保存されます \ libディレクトリ、または-Xbootclasspathパス指定されたパラメータによって、そのようなrt.jarのファイル名として認識による仮想マシンの識別を(、、名前だけでライブラリを満たしていない場合でも、
    libディレクトリになりません仮想マシンのメモリにロードされたロード)ライブラリです。開始クラスローダが直接あなたがクラスローダを開始するために、デリゲートをロードする必要がある場合、ユーザーは、カスタムクラスローダを書き、Javaプログラムを参照することはできません、代わりにヌルを直接使用することができます。
  • 拡張クラスローダ(拡張クラスローダ):このクラスローダは、責任があるExtClassLoader(sun.misc.Launcher $ ExtClassLoader)、によって達成されます 指定したパスがメモリにロードされたすべてのライブラリ/ libに/ EXTまたはjava.ext.dirシステム変数は、開発者が直接、拡張クラスローダを使用することができます。
  • アプリケーションクラスローダ:(アプリケーションクラスローダ)このクラスローダはAppClassLoader(sun.misc.Launcher $ AppClassLoader)によって達成されます。クラスローダは、クラスローダgetSystemClassLoader()はあるメソッドの値を返すので、それは一般的にシステムクラスローダと呼ばれています。これは、一般的には、このプログラムは、デフォルトのクラスローダで、アプリケーションがあまりにも独自のカスタムクラスローダでない場合は、開発者が直接、このクラスローダを使用することができ、ライブラリで指定されたユーザーのパスをロードする責任があります。

親委譲モデル

クラスローダの階層関係を示し、親クラスローダ委譲モデルと呼ばれます。

  親委任モデルブートクラスローダのトップに加えて、クラスローダの残りの部分は、独自の親クラスローダを持っていますここではクラスローダ間の親子関係は、一般的な関係を継承するためになされていないが、親ローダーとの関係で多重化符号の組み合わせの使用。

  作業プロセスの親委任モデル:クラスローダは、クラスが要求を受け取っロードする場合、それは最初にこのクラスをロードしようとするために所有していませんが、完了するために、親クラスローダにこの要求を委任するために、各レベルのクラスローダをそのため、真であるすべてのクラスのロード要求は、最終的にブートクラスローダの上部に到達しなければならない親クラスローダが、彼らは要求を完了することはできませんフィードバックをロードするときにのみ、子をロードするクラスローダを所有することになります。

  委任モデルの利点の両親:そのクラスローダとJavaクラスが一緒に優先度レベルとの関係を持っています。ことができるように、基本クラスを統一します。

  親は、モデルの実装を委託:親委譲モデルの実装コードは、(loadClassメソッド間java.lang.ClassLoaderのに集中しています)。

  次のコードに示すように:コールがロードされていない場合は最初のチェックは、以前にロードされた親クラスローダのはloadClass()メソッドローダが空の親クラスがあれば、親クラスローダのブートローダーとしてデフォルトで使用されています、親からClassNotFoundException例外がスローされた後、その後、ロードするために彼らにfindClass()メソッドを呼び出して、ロードに失敗しました。

protected synchronized Class<?>loadClass(String name,boolean resolve)throws ClassNotFoundException{
    //首先检查请求的类是否已被加载过
    Class c=findLoadedClass(name);
    if(c==null){
        try{
            if(parent!=null){
                c=parent.loadClass(name,false);
            }else{
                c=findBootstrapClassOrNull(name);
            }
        }catch(ClassNotFoundException e){
            //如果父类加载器抛出ClassNotFoundException
            //说明父类加载器无法完成加载请求
        }
        if(c==null)
            c=findClass(name);
    }
    if(resolve)
        resolveClass(c);
    return c;
}

おすすめ

転載: www.cnblogs.com/yjxyy/p/11128769.html