クラスローダ:Java仮想マシン(8)の深い理解

1、仮想マシンのクラスローダ段階アプリケーションは、このタイプのアクションを実装する必要なクラスを取得する方法を決定できるようにするために、クラスの修飾名による場合を除いて、Java仮想マシンにクラスアクションバイナリストリームの説明を取得しますこれは、クラスローダと呼ばれています。そのクラスローダとクラス自体にJava仮想マシンでその独自性を確立するために一緒にクラスを持ってする必要のために、各クラスローダは別の名前空間のクラスを持って、2つのクラスが、彼らが作ったという前提の下で等しいです同じクラスローダがロードされます。

org.xiaofeiyang.classloaderパッケージ; 

インポートにjava.io.IOException;
輸入java.io.InputStreamを。

/ **
* @author:陽春は
* @description:
* @date:2019年11月23日夜10時39分で作成
* /
publicクラスClassLoaderTest {
パブリック静的無効メイン(文字列[] args){ClassNotFoundExceptionがスロー
のClassLoader myLoader =新しいClassLoaderを(){
@Override
<?>パブリッククラスのloadClass(文字列名)は、ClassNotFoundExceptionがスロー{
試み{
文字列fileNameがname.substring = +(name.lastIndexOfを()+ 1 " ")"クラスを。";
入力ストリームは、=はgetClass()でgetResourceAsStream(filename)で。
(== nullである)場合、{
super.loadClass(名前)を返します。
}
バイト[] RES =新しいバイト[is.available()]。
is.read(RES)。
defineClass(名前、RES、0、res.length)を返します。
}キャッチ(のIOException e)の{
新しいClassNotFoundExceptionが(名前を)投げます。
}
}
}。
オブジェクトOBJ = myLoader.loadClass( "org.xiaofeiyang.classloader.ClassLoaderTest")。
System.out.println(obj.getClass())。
System.out.println(OBJのinstanceof org.xiaofeiyang.classloader.ClassLoaderTest)。
}
}
输出如下

java.lang.Classクラス
はfalse

2、親委譲モデル

ローダーの二つのタイプが、ブートクラスローダは、1のクラスローダを開始することで、クラスローダはCで実装された仮想マシン++の一部であり、もう一方はJava言語自体によって実装、他のすべてのクラスローダのための、独立してJava仮想マシンは、すべての継承と抽象クラスにはjava.lang.ClassLoader。

1)スタートクラスローダは、rt.jarのライブラリを認識できるのlibフォルダ、ファイル、Java仮想マシンは、仮想マシンのメモリにロードされてJAVA_HOMEを担当しています。

2)拡張クラスローダ、クラスローダがsun.misc.Launcher $ ExtClassLoaderによって実現され、この一般的なクラスローダは、JAVA_HOME \ libに\ extに下のクラスライブラリをロードする責任があり、開発者が直接このクラスローダを使用することができます。

3)アプリケーション・クラス・ローダー、クラスローダがsun.misc.Launcher $のApp-クラスローダによって実装され、クラスローダは、クラスローダgetSystemClassLoader()メソッドの戻り値である、いわゆるシステムクラスローダがロード船に責任がありますライブラリは、アプリケーションのクラスパスの下で、通常、デフォルトのクラスローダを使用しています。

 

 クラス階層との間のこの関係は、最上位の親委任モデルに加えて、親委任モデルと呼ばれるクラスローダの残りは親クラスローダコードを多重化するためのアプローチの組み合わせを使用して、親クラスローダを持っている必要がありますが必要です。負荷自体はロードするためのイニシアチブを取ることはありません場合は、サブクラス親クラスは、負荷への負荷要求を受信します。利点は、クラスのRTは、Java仮想マシンの安定動作を確保するために、優先交換することはありません。コード内の親委任モデルコードはjava.lang.ClassLoaderを次のように

 

 各クラスローダの統一のベースクラスの親委任モデルの優れたソリューションを提供します。

親委任モデルは三つの条件以下に破壊されます

1)にfindClassメソッドを書き換えるjava.lang.ClassLoaderの問題の必要性を回避するためにloadClassメソッドを書き換える継承

ないセットは親スレッド継承デフォルトは、アプリケーションのクラスローダである場合2)JNDIコードは、ブートクラスローダ、スレッドコンテキストクラスローダを設定することにより、それを呼び出すためにクラスパスを必要としているコードのJNDIインタフェースプロバイダ、スレッドコンテキストクラスローダによってロードされていますデバイス

、どちらがクラスローダのロード操作のサブクラスを完了するために、親クラスローダ要求です。

バンドルは、同じ負荷に置き換えている交換する必要があります場合でも、3)OSGIモジュラー熱い展開、カスタムクラスローダバンドル各プログラムモジュールは、クラスローダを持っています。

OSGiのクラスの検索は、次の順序で実行しました

 

おすすめ

転載: www.cnblogs.com/xiaofeiyang/p/11920846.html