詳細なJAVAベースの--JAVAでリフレクション

JAVA反射
    任意のオブジェクトのために、方法のいずれかであることができ、それを呼び出す; Javaリフレクションは、任意のクラスのために、すべてのこのクラスのプロパティとメソッドに知らされており、動作状態にあるこの動的および動的情報を得ます関数呼び出しは、オブジェクトのメソッドは、反射Java言語と呼ばれています。
Javaリフレクション機構は、主に次の機能を提供し、任意のオブジェクトのクラスは、実行時に属する分析;メンバ変数と、任意のクラスは、実行時に持つ方法を分析するステップと、オブジェクトは実行時に任意のクラスを構築するために、実行時に任意の呼び出しメソッドオブジェクト、動的プロキシを生成します。
1.オブジェクトの得られる特性

。1パブリック・オブジェクトのgetProperty(オブジェクト所有者、文字列フィールド名)をスロー例外{
2クラスownerClass owner.getClass =();

。4 = ownerClass.getFieldフィールド、フィールド(フィールド名)
。5 
。6 =オブジェクトプロパティフィールド.get(所有者);
7。 
8施設のリターン;
9}。
クラスownerClass = owner.getClass():得られたオブジェクトのクラス。

フィールドフィールド= ownerClass.getField(フィールド名):クラスによって得られる特性クラスの宣言。

オブジェクトプロパティ= field.get(所有者):プロパティは非パブリックである場合、オブジェクトのインスタンスによって得られた属性は、IllegalAccessExceptionがそこに報告されます。

2.得られたクラスの静的プロパティ

 1つのgetStaticPropertyパブリックオブジェクト(文字クラス名文字列フィールド名)。
 2が例外をスロー{
 3 =クラスownerClass Class.forNameの(クラス名);
 4 
 。5 = ownerClass.getFieldフィールド、フィールド(フィールド名)
 。6 
 。7オブジェクト= Field.getプロパティ(ownerClass);
 8。 
 9施設のリターン;
10}

クラス= ownerClass Class.forNameの(クラス名):第一のクラスのクラスを取得します。

フィールドフィールド= ownerClass.getField(フィールド名):同上、クラスによって属性クラスの宣言を与えます。

オブジェクトプロパティ= field.get(ownerClass):上記及びここで若干異なる、性質が静的であるため、クラスのクラスから直接に採取。

3.オブジェクトの実行方法

 パブリックオブジェクトは、invokeMethod 1 {例外をスローする(オブジェクトの所有者は、文字列methodNameのは、[]引数オブジェクト)
 2 
 。3 =クラスownerClass owner.getClass();
 4を 
 5クラス[] =新しい新しいクラスargsClass [args.length];
 6 
 。7(INTを0 = I、J = args.length; Iは、Jが<; Iは++){
 8 argsClass [I] =引数[I] .getClass();。
 。9}
10 
11メソッド、メソッド= ownerClass.getMethod(methodNameの、argsClass)が;
12である 
13れますMethod.invokeリターン(所有者、引数);
14}
クラスowner_class = owner.getClass():すべての上、オブジェクトはクラスでなければなりません。

5-9 OK:メソッドの条件を見ているように、クラスのアレイの設定パラメータ、。

方法メソッド= ownerClass.getMethod(methodNameの、argsClass ): メソッドクラス名とパラメータで配列を得るために実行される方法。

method.invoke(所有者、引数):メソッドの実装は、invokeメソッドは、このメソッドのパラメータオブジェクトを実行することで、アレイのパラメータ。戻り値はオブジェクトでなく、メソッドの戻り値の両方です。

4クラスの静的メソッドを実行する

 1はパブリックオブジェクト(文字クラス名、文字列methodNameに、invokeStaticMethod。
 2オブジェクト[]引数)が例外をスロー{
 3 =クラスownerClass Class.forNameの(クラス名);
 4 
 。5クラス[] =新しい新しいクラスargsClass [ args.length];
 6 
 7(I = 0、J = args.length int型; Iは、Jが<; Iは++){
 8 argsClass [I] =引数[I] .getClass();。
 。9}
10 
。11メソッド、メソッド= ownerClass .getMethod(methodNameの、argsClass);
12れます 
13(NULL、引数)が返さMethod.invoke;
} 14

と同じ基本原理および実施例3、これは静的な方法、例として実行する必要であるので、起動パラメータは、nullの場合、最後の行は異なります。

新しいインスタンス
 。1 
 2のnewInstanceパブリックオブジェクト(文字クラス名、[]引数オブジェクト){例外をスロー
 ; 3 =クラスnewoneClass Class.forNameの(クラス名)
 4。 
 5クラス[] =新しい新しいクラスargsClass [args.length];
 6 
 7。 {(; Iは、Jが<I ++はI = 0、J = args.lengthをINT)
 ; 8 argsClass [I] =引数[I] .getClass()。
 9。}
10 
11の短所= newoneClass.getConstructorコンストラクタ(argsClass);
12である 
13れますcons.newInstanceリターン(引数);
14 
15}

どこの方法は、新しいインスタンスを作成するためのパラメータのコンストラクタで実行される方法であると述べました。パラメータが直接()newoneClass.newInstanceを使用することができない場合に達成されます。

クラスnewoneClass = Class.forNameの(クラス名):最初のステップは、クラスの構成例を得ました。

ライン5〜9:クラスの配列パラメータを求めます。

コンストラクタ短所= newoneClass.getConstructor(argsClass):得られたコンストラクタ。

cons.newInstance(引数):新しいインスタンス。

6.クラスのインスタンスかどうかを決定する

。1でisinstanceパブリックブール(オブジェクトobjは、クラスCLS){
2戻りcls.isInstance(OBJ)
3}

7.は、配列の要素を得
、1パブリックオブジェクトgetByArray(Object配列をインデックスINT){
2リターンArray.get(配列インデックス);
3}

ます。https://www.cnblogs.com/licheng/archive/2008/07/30/1256799.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_33921089/article/details/92633195