リフレクションの使用
リフレクションは、一般的には、Java仮想マシンで稼働しているアプリケーションの実行時動作を調査または変更する機能を必要とするプログラムで使用されます。 これは比較的高度な機能であるため、Java言語の基礎を十分に理解した開発者のみが使用することを推奨します。 この点を十分に理解していれば、別の方法では不可能なアプリケーションのオペレーションの処理を可能にするための強力なテクニックとして、リフレクションを使用できます。
- 拡張機能
- 拡張オブジェクトの完全修飾名を使用して、拡張オブジェクトのインスタンスを作成すると、アプリケーションから外部のユーザー定義クラスを使用できるようになります。
- クラス・ブラウザと視覚的な開発環境
- クラス・ブラウザは、クラス・メンバーを列挙する機能を備えている必要があります。 リフレクションが提供する型情報を利用することで、開発者は視覚的な開発環境で正しいコードを記述できるようになります。
- デバッガとテスト・ツール
- デバッガは、クラスのプライベート・メンバーを確認する機能を備えている必要があります。 テスト・ハーネスでリフレクションを利用することで、クラスに定義された検出可能なAPIセットを体系的に呼び出し、テスト・スイートでの高水準のコード・カバレッジを実現できるようになります。
リフレクションの弱点
リフレクションは強力な機能ですが、むやみに使用すべきではありません。 リフレクションを使用せずに実行できる処理に対しては、リフレクションを使用しないことを推奨します。 リフレクションを使用してコードにアクセスする場合は、次の考慮事項を念頭に置く必要があります。
- パフォーマンス・オーバーヘッド
- リフレクションには動的に解決される型が含まれるため、一部のJava仮想マシンの最適化が適用されない場合があります。 この場合、リフレクションを使用した処理はリフレクションを使用しない処理よりもパフォーマンスが低くなるため、パフォーマンス重視のアプリケーションで頻繁に呼び出されるコード部分にはリフレクションを使用しないことを推奨します。
- セキュリティ上の制限
- リフレクションには実行時権限が必要ですが、セキュリティ・マネージャの管理下で実行されている場合はこの権限が使用できない可能性があります。 制限のあるセキュリティ・コンテキスト(アプレットなど)でコードを実行する必要がある場合、これは重要な考慮事項になります。
- 内部公開のリスク
- リフレクションを使用したコードでは、
private
のフィールドやメソッドへのアクセスなど、リフレクション使用していないコードでは不正になる処理でも実行できてしまうため、リフレクションを使用することで予期しない副次的作用が生じ、コードの機能障害や移植性が失われる可能性があります。 また、リフレクションを使用したコードは抽象化を妨げるため、プラットフォームのアップグレード時に動作が変更される場合があります。
コース・レッスン
このコースでは、クラス、フィールド、メソッド、およびコンストラクタにアクセスするための、リフレクションの一般的な使用法について説明します。 各レッスンには、コード例、ヒント、トラブルシューティング情報が含まれています。
- Classes
- このレッスンでは、
Class
オブジェクトを取得し、これを使用してクラスのプロパティ(宣言とコンテンツを含む)を調査するさまざまな方法について説明します。
- Members
- このレッスンでは、Reflection APIを使用して、クラスのフィールドやメソッド、およびコンストラクタを見つける方法について説明します。 フィールド値の設定と取得、メソッドの呼出し、固有のコンストラクタを使用した新規オブジェクト・インスタンスの例が提示されています。
- Arrays and Enumerated Types
- このレッスンでは、配列と
enum
型という2つの特別なクラス型について説明します。前者は実行時に生成され、後者は独自の名前付きオブジェクト・インスタンスを定義します。 サンプル・コードでは、配列のコンポーネント型を取得する方法と、配列またはenum
型のフィールド値の設定および取得方法を示します。
注:このコースに含まれる例は、リフレクションAPIの使用を試すために設計されたものです。 したがって、例外処理の方法が本番コードとは異なります。 具体的に言うと、本番コードではユーザーから見える形でスタック・トレースをダンプすることは推奨されていません。