Javaのリフレクション機構が何の目的で存在しているのか分からず困っています。
現在、Effective Javaを読んでおり、その中でリフレクションに関する部分があるのですが、何を言っているのかわかりません。
知りたいことは以下の様なことです。
・リフレクションの目的
・リフレクションの使用されるケース
・リフレクションよりインターフェースを使用せよと言っている意味(Effective Java内で)
わかる方がいましたら教えていただきたです。よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
・リフレクションの目的
リフレクションの目的は、プログラムの実行時に型情報を取得・操作することです。
通常のインターフェイスやクラスでは、ソースコードのコンパイル時に型情報を取得・操作します。これは裏を返すと、コンパイル時点で未知のインターフェイスやクラスは、「リフレクション」という機能なしには扱えないことを意味します。
・リフレクションよりインターフェースを使用せよと言っている意味(Effective Java内で)
上記のようにリフレクションは強力な言語機能ですが、コンパイラの支援を受けられないという問題があります。
たとえば、メソッド名や引数/個数などの型情報が一致していないと、コンパイラは不整合をチェックしエラーを報告してくれます。一方のリフレクションは単なる文字列としてメソッド名や引数型を処理するので、不整合のチェックをコンパイル時には行えず、実行時になって初めて例外スローされます。(不具合の発覚フェーズが遅れます。)
他回答にあるprivate
を無視なども、このコンパイラ支援(チェック機構)を受けられない/受けなくてすむことを利用したテクニックです。
・リフレクションの使用されるケース
一部のアプリケーション・フレームワークの実装などで利用されます。特に、"アノテーション"を利用するフレームワークでは高度に活用されています。
フレームワーク・コードの実装時点では、利用側の具体的なクラスやインターフェイスは分かりませんから、リフレクション機能が必要になります。
投稿2015/03/09 04:24
編集2015/03/09 04:33総合スコア6191
0
ベストアンサー
リフレクションを使用すると、アクセス修飾子の制約を破壊するプログラムを書くことができます。また、リフレクション機能はパフォーマンスが良くありません。
通常はそのクラスの内部情報、つまりprivate
修飾子の情報にアクセスできませんので、テストコードや解析ツールやIDEなどでは、リフレクションを使用しなければ実現できないこともあります。
上記以外のケースでどうしても使うのならば、インターフェイスを定義してClass.forName(String)
からインスタンスを生成させる程度に留めておくのが良いでしょう。
プラグイン機能などは、一部リフレクションの機能を使っています。インターフェイスの実装クラスをプロパティーファイルにFQCNで書いておけば、コンパイル時にそのクラスが無くても実行時に利用することができます。JDBCドライバーがこの一例ですね。
投稿2015/03/08 15:16
編集2015/03/09 15:31総合スコア9390
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
オブジェクト指向言語であるJavaでは、クラス内の情報はカプセル化されていて、ふつうには外からアクセスできませんが、そのシステムを「横紙破り」して内部にアクセスするための機能がリフレクションです。
デバッガやコードテストなど、コード自体の構造にアクセスする必要がある場合はともかく、そうでないような状況で必要になる場面は、そうそう来ないでしょう。
処理を行う型にある程度の柔軟性を持たせたい場合でも、その型が取るべき条件は(よほど汎用的なラッパーを作るのでもない限り)決まっているでしょうから、むやみにリフレクションを使うより、満たすべき条件でインターフェースを立てて、それを基準に操作したほうが、見た目・コンパイラチェック・動作速度いずれにおいても適切だということです。
別な言語でですが、Web系のMVCフレームワークを使っていた時に、コントローラー内にフック関数を仕掛けたところ、もとは「外部コード→コントローラーの関数」という呼び出しだったものが「外部コード→コントローラー内のフック関数→同じコントローラーの関数」に変化してしまった結果、(同じクラスなので)privateまで呼び出せるようになってしまい、リフレクションでpublicチェックを入れる、という場面がありました。
投稿2015/03/09 01:13
総合スコア145184
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/03/09 15:23