JAVA反射
任意のオブジェクトのために、方法のいずれかであることができ、それを呼び出す; Javaリフレクションは、任意のクラスのために、すべてのこのクラスのプロパティとメソッドに知らされており、動作状態にあるこの動的および動的情報を得ます関数呼び出しは、オブジェクトのメソッドは、反射Java言語と呼ばれています。
Javaリフレクション機構は、主に次の機能を提供し、任意のオブジェクトのクラスは、実行時に属する分析;メンバ変数と、任意のクラスは、実行時に持つ方法を分析するステップと、オブジェクトは実行時に任意のクラスを構築するために、実行時に任意の呼び出しメソッドオブジェクト、動的プロキシを生成します。
1.オブジェクトの得られる特性
。1パブリック・オブジェクトのgetProperty(オブジェクト所有者、文字列フィールド名)をスロー例外{
2クラスownerClass owner.getClass =();
3
。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}
任意のオブジェクトのために、方法のいずれかであることができ、それを呼び出す; Javaリフレクションは、任意のクラスのために、すべてのこのクラスのプロパティとメソッドに知らされており、動作状態にあるこの動的および動的情報を得ます関数呼び出しは、オブジェクトのメソッドは、反射Java言語と呼ばれています。
Javaリフレクション機構は、主に次の機能を提供し、任意のオブジェクトのクラスは、実行時に属する分析;メンバ変数と、任意のクラスは、実行時に持つ方法を分析するステップと、オブジェクトは実行時に任意のクラスを構築するために、実行時に任意の呼び出しメソッドオブジェクト、動的プロキシを生成します。
1.オブジェクトの得られる特性
。1パブリック・オブジェクトのgetProperty(オブジェクト所有者、文字列フィールド名)をスロー例外{
2クラスownerClass owner.getClass =();
3
。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で再現