さらに、Bi 先生はリフレクションのメカニズムについても説明してくれました。将来的には必ずしもリフレクションを開発プロセスに組み込む必要はありませんが、リフレクションは Java の強力なツールであり、実行時に実行できる柔軟なコードを作成できます。コンポーネント間のソース代表リンクを使用しないアセンブリ。たとえば、Tomcat クラス ローダーでは、このメカニズムは多くのフレームワークで使用されています。
1. リフレクションとは
リフレクションの概念は、1982 年に Smith によって最初に提案されました。これは主に、プログラムが自身の状態の動作にアクセスし、検出し、変更する能力を指します。リフレクションは、Java プログラム開発言語の機能の 1 つであり、実行中の Java プログラム自体をチェック (「自己監査」) し、プログラムの内部プロパティを直接操作することもできます。
2. Java リフレクションに必要なクラス
1.Class クラス: そのインスタンスは、実行中の Java アプリケーション内のクラスとインターフェイスを表します
2.Constructor クラス: クラス情報とアクセスのための単一のコンストラクター メソッドを提供します。
3.Method クラス: クラスまたはインターフェイスの単一メソッドに関する情報を提供します。
4.Array クラス: 配列を動的に作成したり、配列にアクセスしたりするための静的メソッドを提供します。
5.フィールド クラス: クラスまたはインターフェイスのプロパティに関する情報と、それに対する動的アクセス権を提供します。
3. リフレクションの機能
上記で関連するクラスをリストしましたが、これらのクラスを使用して具体的に何ができるでしょうか?
1) 指定されたクラスの Class オブジェクトを取得します。
メソッド 1、object.getClass を介して (例: person p; Class c=p.getClass();)
メソッド 2、forName を介して取得します。 Class クラスのメソッド (例: Class c=Class.forName(class name);)
方法 3: name.class 型で取得 (Class c = int.class)
2) 任意のオブジェクトを構築します
① クラス名に基づいてオブジェクトを作成します。
② 新しく作成したオブジェクトを返します。
l 引数なしのコンストラクターを使用すると、newInstance メソッドを使用するだけで済みます。クラスオブジェクトの。
Class c=Class.forName(クラス名); Person p =(Person)c.newInstance;
l パラメータ化されたコンストラクターを使用します。手順は次のとおりです。
① 指定されたクラスのオブジェクトを取得します。 (同上)
② 指定したパラメータの要件を満たすコンストラクタクラスオブジェクトを Class オブジェクト経由で取得
Constructor cons = c.getConstructor(String.class)
③ の newInstance メソッドを呼び出す指定された Constructor オブジェクトを取得し、対応するパラメーター値を渡してオブジェクトを作成します。
人 p = (人) cons.newInstance ("Zhang San");
3) 実行時に任意のオブジェクトのメソッドを呼び出し、リフレクションを通じてプライベート メソッドを呼び出すこともできます
① 指定されたメソッドを取得しますclass オブジェクト(同上)
② 必要に応じてインスタンスを作成します
③ Class オブジェクトの getDeclaredMethods で Method のインスタンスを取得し(必要に応じて別のメソッドを選択できます)、invoke メソッドでメソッドを呼び出します
Method m=c.getDeclaredMethods( "setName", String.class);
returnvalue = m.invoke(p,"zhangsan");
注: プライベート メソッドの場合は、最初に呼び出すことができます。このメソッドに対応する Method オブジェクトの setAccessible(true) このメソッドのセキュリティ チェックをキャンセルします
4) 実行時に任意のオブジェクトのプロパティを呼び出します
① 指定されたクラスのオブジェクトを取得します (同上)
② 必要に応じてインスタンスを作成します。
③ Class オブジェクトの getDeclaredField を渡します(必要に応じて別のメソッドを選択できます) Field クラスのインスタンスを取得し、Set メソッドで指定したオブジェクトの値を変更し、取得しますオブジェクトの値。
フィールド f =c.getDeclaredField("name");
f.set(p,"Zhang San");