リフレクションは Java プログラム開発言語の機能の 1 つで、実行中の Java プログラムが独自の情報を取得し、実行時に Java にアクセスできるようになります。 、メソッド、コンストラクターなど。
アプリケーション シナリオ
ユニバーサル フレームワークの開発 - リフレクションの最も重要な用途は、さまざまなユニバーサル フレームワークを開発することです。たとえば、Spring は XML ファイルを通じて JavaBeans やフィルターなどを設定しますが、フレームワークの汎用性を確保するために、設定ファイルに応じて異なるオブジェクトやクラスをロードし、異なるメソッドを呼び出す必要がある場合があります。この場合、リフレクションは必要です。使用される - 実行時の動的ロードが必要です。ロードされたオブジェクト。動的プロキシ - アスペクト プログラミング (AOP) では、特定のメソッドをインターセプトする必要があり、通常は動的プロキシ メソッドが選択されます。アノテーション - アノテーション自体はマークとしてのみ機能するため、リフレクション機構を使用してアノテーション マークに従ってアノテーション インタプリタを呼び出し、動作を実行する必要があります。リフレクションがなければ、アノテーションはアノテーションと同じように役に立ちません。拡張機能 - アプリケーションは、完全修飾名を使用して拡張オブジェクト インスタンスを作成することにより、外部ユーザー定義クラスを使用できます。欠点
パフォーマンスのオーバーヘッドが大きい - リフレクション操作のパフォーマンスは非リフレクション操作のパフォーマンスより悪いため、パフォーマンス重視のアプリケーションで頻繁に呼び出されるコード セグメントでは避けるべきです。カプセル化の破壊 - リフレクションを通じてメソッドを呼び出すときに権限チェックが無視される可能性があるため、カプセル化が破壊され、セキュリティ上の問題が発生する可能性があります。内部露出 - リフレクションを使用すると、プライベート フィールドやメソッドへのアクセスなど、リフレクション以外のコードでは不正な操作をコードが実行できるため、リフレクションを使用すると、意図しない副作用が発生し、コードが誤動作し、移植性が損なわれる可能性があります。リフレクティブ コードは抽象化を破壊するため、プラットフォームがアップグレードされると動作が変わる可能性があります。 Class オブジェクト
リフレクションを使用するには、まず操作対象のクラスに対応する Class オブジェクトを取得する必要があります。
リフレクションの本質: 実行時に、各 Java クラスのさまざまな属性が Java オブジェクトにマップされます。
次のコードが定義されている場合:
User user = new User();
1. JVM がメソッドをロードし、new User() に遭遇すると、JVM はwill User.class をロードするユーザーの完全修飾名;
2. JVM はローカル ディスク上で User.class ファイルを検索し、それを JVM メモリにロードします。
3. JVM はクラスローダーを呼び出すことで、このクラスに対応する Class オブジェクトを自動的に作成し、JVM のメソッド領域に格納します。
Class を取得する 3 つの方法:
(1) Class クラスの静的メソッド forName を使用する
アプリケーション シナリオ
一般的なフレームワークの開発 - リフレクションが最も重要です。その目的は、さまざまな一般的な枠組みを開発することです。たとえば、Spring は XML ファイルを通じて JavaBeans やフィルターなどを設定しますが、フレームワークの汎用性を確保するために、設定ファイルに応じて異なるオブジェクトやクラスをロードし、異なるメソッドを呼び出す必要がある場合があります。この場合、リフレクションは必要です。使用される - 実行時の動的ロードが必要です。ロードされたオブジェクト。動的プロキシ - アスペクト プログラミング (AOP) では、特定のメソッドをインターセプトする必要があり、通常は動的プロキシ メソッドが選択されます。アノテーション - アノテーション自体はマークとしてのみ機能するため、リフレクション機構を使用してアノテーション マークに従ってアノテーション インタプリタを呼び出し、動作を実行する必要があります。リフレクションがなければ、アノテーションはアノテーションと同じように役に立ちません。拡張機能 - アプリケーションは、完全修飾名を使用して拡張オブジェクト インスタンスを作成することにより、外部ユーザー定義クラスを使用できます。欠点
パフォーマンスのオーバーヘッドが大きい - リフレクション操作のパフォーマンスは非リフレクション操作のパフォーマンスより悪いため、パフォーマンス重視のアプリケーションで頻繁に呼び出されるコード セグメントでは避けるべきです。カプセル化の破壊 - リフレクションを通じてメソッドを呼び出すときに権限チェックが無視される可能性があるため、カプセル化が破壊され、セキュリティ上の問題が発生する可能性があります。内部露出 - リフレクションを使用すると、プライベート フィールドやメソッドへのアクセスなど、リフレクション以外のコードでは不正な操作をコードが実行できるため、リフレクションを使用すると、意図しない副作用が発生し、コードが誤動作し、移植性が損なわれる可能性があります。リフレクティブ コードは抽象化を破壊するため、プラットフォームがアップグレードされると動作が変わる可能性があります。 Class オブジェクト
リフレクションを使用するには、まず操作対象のクラスに対応する Class オブジェクトを取得する必要があります。
リフレクションの本質: 実行時に、各 Java クラスのさまざまな属性が Java オブジェクトにマップされます。
次のコードが定義されている場合:
User user = new User();
1. JVM がメソッドをロードし、new User() に遭遇すると、JVM はwill User.class をロードするユーザーの完全修飾名;
2. JVM はローカル ディスク上で User.class ファイルを検索し、それを JVM メモリにロードします。
3. JVM はクラスローダーを呼び出すことで、このクラスに対応する Class オブジェクトを自動的に作成し、JVM のメソッド領域に格納します。
Classを取得する3つの方法:
(1) Classクラスの静的メソッドforNameを利用する
(2) Object の getClass メソッドを呼び出す
Reflection でインスタンス オブジェクトを作成
クラスの newInstance を使用オブジェクトメソッド。 Constructor オブジェクトの newInstance メソッドを使用します。
java.lang.reflect パッケージのコア インターフェイスとクラス
Member インターフェイス - 単一のメンバーについて反映します。 (フィールドまたはメソッド) またはコンストラクタの識別情報。フィールド クラス - クラスのフィールドに関する情報と、クラスのフィールドにアクセスするためのインターフェイスを提供します。メソッド クラス - クラスのメソッドと、クラスのメソッドにアクセスするためのインターフェイスに関する情報を提供します。コンストラクター クラス - クラスのコンストラクターと、クラスのコンストラクターにアクセスするためのインターフェイスに関する情報を提供します。 Array クラス - このクラスは、JAVA 配列を動的に生成してアクセスするためのメソッドを提供します。修飾子クラス - クラスとメンバーのアクセス修飾子をデコードするための静的メソッドと定数を提供します。プロキシ クラス - プロキシ クラスとクラス インスタンスを動的に生成する静的メソッドを提供します。
[おすすめコース: Java関連コース]
以上がJava の基本的なリフレクションの簡単な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。