質問: Javaのリフレクションについて、パフォーマンスの問題と、型安全の言語仕様の点から、リフレクションの使用はあまり好ましくないというのが一般的な見解かと思いますが、 「じゃあなぜ実装されているんだ?」 と思い、調べてみたら、 「非常に効果を発揮する場面でちょこっと使う」 という記事を見ました。 なんだその抽象的な説明は!ということで、どういう場面で使うべきでしょうか? 使いたいけど使っていいのかわからなかったシチュエーションが2回ありました。 下記について、どうすべきかもおしえてください。 1. インスタンスの複製 Aというエンティティーがあり、そのインスタンスを同一クラスに複製、 もしくは別クラスで同名フィールドを持つクラスに複製するとき、 それぞれのゲッターセッターを用いて1フィールドづつ代入すると、 フィールド依存が強くて、フィールド変更時に大変だからリフレクションを使いたいな というケース 2. バンドルクラスからそれぞれのクラスに分配 Aというバンドルインスタンスがあり、そのインスタンスはデータベースのリレーションをひとまとめにしたクラスで、 B, C, Dという分配先Entityに代入する。 なかでもBは、Aから複数個生成され、 ・AはBの共通項目をメンバ変数として持ち、Bの固有項目を内部クラス(X)のListとして持っている。 ・Aの持っているCとDの項目は、共通項目として持っている。 ちょっと2個目はわかりずらいと思うので、わからなかったら結構です。 よろしくお願いします。
回答: Javaのリフレクションは「**実行時に**プログラム自身の情報を取得/振る舞いを変更する」仕組みです。 公式チュートリアル Trail: The Reflection API (The JavaTM Tutorials) でいくつかユースケースが言及されています。 > > Reflection is commonly used by programs which require the ability to examine or modify the runtime behavior of applications running in the Java virtual machine. This is a relatively advanced feature and should be used only by developers who have a strong grasp of the fundamentals of the language. With that caveat in mind, reflection is a powerful technique and can enable applications to perform operations which would otherwise be impossible. > > > **Extensibility Features** > > An application may make use of external, user-defined classes by creating instances of extensibility objects using their fully-qualified names. > > > **Class Browsers and Visual Development Environments** > > A class browser needs to be able to enumerate the members of classes. Visual development environments can benefit from making use of type information available in reflection to aid the developer in writing correct code. > > > **Debuggers and Test Tools** > > Debuggers need to be able to examine private members on classes. Test harnesses can make use of reflection to systematically call a discoverable set APIs defined on a class, to insure a high level of code coverage in a test suite. > > > 1,2 で挙げられているのはO/Rマッピング(ORM; Object-relational mapping)的な使い方でしょうか。ORMをJava リフレクションで実現しているフレームワークはいくつか存在します。ただし、アプリケーション・ロジックとしてリフレクションを利用すること稀かと思います。