ホームページ >Java >&#&チュートリアル >Java リフレクションを定義および使用する方法
Java プログラムの実行中に、クラス、メソッド、プロパティなどの要素を動的に取得および操作する機能を Java と呼びます。反射。これにより、プログラムの実行中にクラスに関する情報を取得して操作できるため、Java 言語の柔軟性とスケーラビリティが大幅に拡張されます。
Javaでは各クラスに対応するClassオブジェクトが存在し、リフレクションではこのClassオブジェクトを利用してクラス情報の取得や操作を行います。
Java では、Class オブジェクトを取得する方法が 3 つあります。
これが最も一般的な方法の 1 つは、Class.forName() メソッドを使用して Class オブジェクトを取得することです。例:
Class<?> clazz = Class.forName("com.example.MyClass");
オブジェクトの getClass() メソッドを通じて、それが属する Class オブジェクトを取得できます。例:
MyClass obj = new MyClass(); Class<?> clazz = obj.getClass();
クラス リテラル定数を使用して Class オブジェクトを取得します。例:
Class<?> clazz = MyClass.class;
Class オブジェクトを取得すると、クラス名、継承されたクラス、実装されたインターフェイス、コンストラクター、メソッドやフィールドなど、クラスに関するさまざまな情報を取得できます。以下はクラスのフィールドを取得する例です。
Class オブジェクトの getFields() メソッドを使用して、すべての公開変更フィールドを取得できます。たとえば、次のようになります。
Field[] fields = clazz.getFields(); for (Field field : fields) { System.out.println(field.getName()); }
Class オブジェクトの getField() メソッドを使用して、指定した名前を持つ変更済みパブリック フィールドを取得できます。たとえば、次のようになります。
Field field = clazz.getField("name"); System.out.println(field.getName());
Can get Class オブジェクトの getDeclaredFields() メソッドを通じて取得します。 public、protected、private によって変更されたフィールドを含む、すべての宣言されたフィールド。たとえば、次のようになります。
Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { System.out.println(field.getName()); }
Field field = clazz.getDeclaredField("name"); System.out.println(field.getName());
Operation クラスとオブジェクト
3.1 オブジェクトの作成
MyClass obj = (MyClass) clazz.newInstance();
3.2 プロパティへのアクセス
Field field = clazz.getDeclaredField("name"); field.setAccessible(true); field.set(obj, "张三"); String name = (String) field.get(obj);
上記のコードは、最初にクラスの name 属性を取得してアクセス可能に設定し、次にリフレクションを通じて属性値を「Zhang San」に設定し、最後に属性値を取得して割り当てます。 name 変数に。
リフレクション アプリケーション シナリオ
4.1 依存関係の注入
4.2 設定ファイルの解析
4.3 動的プロキシ
リフレクションのメリットとデメリット
実行時にクラス情報を動的に取得して操作する必要があるため、通常、リフレクション操作のパフォーマンスはクラスの直接操作よりも悪く、これがリフレクションの欠点です。リフレクションを使用すると、オブジェクトのメソッドを呼び出したり、プロパティにアクセスしたりするコードは通常、リフレクションを使用するコードよりも単純で明確になるため、コードの可読性が低下します。
以上がJava リフレクションを定義および使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。