8.1.17ユーザ定義のクラスローダーは、バージョン1.2を使用しています

8.1.17ユーザ定義のクラスローダーは、バージョン1.2を使用しています

クラスローダは元々、バージョン1.2にバージョン1.1の仮想マシンの設計、だけでなく、仕事として記載された前に。バージョン1.2は、java.lang.ClassLoaderのははloadClass()は、特定の実装に参加しましたデフォルトであるが、この特定の方法は、依然として、サブクラスで覆うことができます。loadClass()動作しますが、カバーのloadClass()ユーザーモードのカスタムクラスローダを取るために、バージョン1.2にバージョン1.1からそう昔ながら変更されていないため、バージョンができ、まだ仕事シュウ0.2インチ

完全修飾名のloadClass()メソッドの指定されたタイプを見つけたりバイトの配列を生成するための何らかの方法を見つける必要があり、Javaクラスファイルの内部形式データ(フォーマットによって定義される:はloadClass()は、動作の基本モードでありますタイプ)。loadClass()がこれらのバイトを見つけるか生成できない場合は、ClassNotFoundExceptionがスローされます。そうでなければ、のloadClass()は、特定のクラスのClassLoader defineClass文の()メソッドにバイト配列を渡します。defineClass()へのバイト配列を渡すことによって、のloadClass()仮想マシンは、ユーザー定義、外出先の名前空間のクラスローダに入ってくるバイト配列を要求します。あなたがデータ保護ドメインの種類を指定することができるのloadClass()の呼び出しは、defineClass()、所属、バージョン1.2では、。loadClassタイプのクラスローダ()メソッドが正常にロードされたときと、それはロードされたオブジェクトのjava.lang.Classのこの新しいタイプの代表を返します。

loadClass java.lang.ClassLoaderのクラスは、()はloadClass()メソッドの動作を実装し、以下の手順によって具現化されます。

1)要求)方法(FindLoadedClass(貫通)クラスローダの名前空間にロードされているかどうかを確認入力します。trueの場合、クラスのインスタンスがロードされた型を持つ返します。

2)それ以外の場合は、クラスローダは親ローダーを委任します。両親は、クラスのインスタンスを返した場合は、置きます

クラスのインスタンスが返されます。

3)それ以外の場合は、コールにfindClass()は、にfindClass()が必要タイプを定義するJavaクラスファイル形式()を使用して、バイト配列、コンテンツを検索または生成しようとします。成功した場合、にfindClass()このバイトが渡され
、人々はこのタイプを試し導くれdefineClass()、クラスのインスタンスを返します。findCIass()はクラスの例を返した場合、のloadClass()クラスは、返されたインスタンスを置きます。

4)それ以外の場合、にfindClass()は中止治療にはいくつかの例外をスローし、そしてのloadClass()は、同じ例外をスローし、アボート。

まだサブクラス化ClassLoadcrバージョン1.2とカバーのloadClass()メソッドではなく、カスタムクラスローダ1.2作成のバージョンでは、クラスローダの仕方をサブクラスとにfindClass()メソッドを達成推奨しながら。このようにfindClass()メソッドのルックス:

// Aメソッドは、クラスjava.lang.ClassLoaderの中で宣言しました

保護されたクラスにfindClass(文字列名)ClassNotFoundExceptionがスローされます。

findClass()メソッドは、操作の基本モード:にfindClass()型の完全修飾名を受け取るには、ロードされますがする - パラメータを。バイト配列を検索または生成するためにfindClass()最初の試み、コンテンツは、Javaクラスファイル形式(フォーマットタイプをロードする必要が定義)です。findClass()はバイト配列を決定または生成することができない場合は、ClassNotFoundExceptionが例外や中断をスロー。そうでない場合、にfindClass()呼び出しdefineClass()は、ゆう所望の名前を入力し、バイトの任意配列のProtectionDomainオブジェクトがパラメータとしてこの種のドメインに属する保護指定しました。defineCIass()は、このタイプのクラスの代表のインスタンスを返す場合、にfindClass()単にその呼び出し元に、同じクラスのリターンのインスタンス。それ以外の場合は、defineClass()は、いくつかの例外をスローし、アボート、にfindClass()も同じ例外とアボートをスローします。

ここでGreeterClassローダバージョンの(代わりのloadClass()メソッドを上書きするの)テイクカバーにfindClass()メソッドは、次のとおりです。

文字列変数はGreeterChssLoader単一の引数のコンストラクタに必要な唯一のパラメータです。このクラスローダは、ユーザーのカスタムクラスローダの参照を使用してスーパークラスのコンストラクタメソッドを呼び出すことはできませんので、このコンストラクタは、単一のパラメータを呼び出し側で定義された親クラスローダへの参照を受け付けていないため。つまり、単にシステムとして、このクラスローダの親クラスローダになり、デフォルトスーパークラスの引数なしのコンストラクタのバージョンを呼び出し、です。ことを除いて建設する別の方法(2つの引数のコンストラクタ)

おすすめ

転載: www.cnblogs.com/mongotea/p/11979775.html