質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.04%

Javaのリフレクションの目的

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 4,422

score 19

Javaのリフレクション機構が何の目的で存在しているのか分からず困っています。

現在、Effective Javaを読んでおり、その中でリフレクションに関する部分があるのですが、何を言っているのかわかりません。

知りたいことは以下の様なことです。

・リフレクションの目的
・リフレクションの使用されるケース
・リフレクションよりインターフェースを使用せよと言っている意味(Effective Java内で)

わかる方がいましたら教えていただきたです。よろしくお願いします。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

リフレクションを使用すると、アクセス修飾子の制約を破壊するプログラムを書くことができます。また、リフレクション機能はパフォーマンスが良くありません。

通常はそのクラスの内部情報、つまりprivate修飾子の情報にアクセスできませんので、テストコードや解析ツールやIDEなどでは、リフレクションを使用しなければ実現できないこともあります。

上記以外のケースでどうしても使うのならば、インターフェイスを定義してClass.forName(String)からインスタンスを生成させる程度に留めておくのが良いでしょう。
プラグイン機能などは、一部リフレクションの機能を使っています。インターフェイスの実装クラスをプロパティーファイルにFQCNで書いておけば、コンパイル時にそのクラスが無くても実行時に利用することができます。JDBCドライバーがこの一例ですね。

参考URL:
リフレクションよりインタフェースを選ぶ - すぬぽぽー@技術力を高めるための"綴り"(・_・)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/03/10 00:21

    arguisさん
    回答ありがとうございます。
    アクセス修飾子とリフレクションの話とても勉強になりました。
    参考URLの内容も私が知りたかったことが書いてありとても役立ちました、ありがとうございます!

    キャンセル

+1

・リフレクションの目的 
リフレクションの目的は、プログラムの実行時に型情報を取得・操作することです。

通常のインターフェイスやクラスでは、ソースコードのコンパイル時に型情報を取得・操作します。これは裏を返すと、コンパイル時点で未知のインターフェイスやクラスは、「リフレクション」という機能なしには扱えないことを意味します。

・リフレクションよりインターフェースを使用せよと言っている意味(Effective Java内で) 
上記のようにリフレクションは強力な言語機能ですが、コンパイラの支援を受けられないという問題があります。

たとえば、メソッド名や引数/個数などの型情報が一致していないと、コンパイラは不整合をチェックしエラーを報告してくれます。一方のリフレクションは単なる文字列としてメソッド名や引数型を処理するので、不整合のチェックをコンパイル時には行えず、実行時になって初めて例外スローされます。(不具合の発覚フェーズが遅れます。)

他回答にあるprivateを無視なども、このコンパイラ支援(チェック機構)を受けられない/受けなくてすむことを利用したテクニックです。

・リフレクションの使用されるケース 
一部のアプリケーション・フレームワークの実装などで利用されます。特に、"アノテーション"を利用するフレームワークでは高度に活用されています。

フレームワーク・コードの実装時点では、利用側の具体的なクラスやインターフェイスは分かりませんから、リフレクション機能が必要になります。


投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/03/10 00:23

    yohhoyさん
    回答ありがとうございます。

    キャンセル

0

オブジェクト指向言語であるJavaでは、クラス内の情報はカプセル化されていて、ふつうには外からアクセスできませんが、そのシステムを「横紙破り」して内部にアクセスするための機能がリフレクションです。

デバッガやコードテストなど、コード自体の構造にアクセスする必要がある場合はともかく、そうでないような状況で必要になる場面は、そうそう来ないでしょう。

処理を行う型にある程度の柔軟性を持たせたい場合でも、その型が取るべき条件は(よほど汎用的なラッパーを作るのでもない限り)決まっているでしょうから、むやみにリフレクションを使うより、満たすべき条件でインターフェースを立てて、それを基準に操作したほうが、見た目・コンパイラチェック・動作速度いずれにおいても適切だということです。

別な言語でですが、Web系のMVCフレームワークを使っていた時に、コントローラー内にフック関数を仕掛けたところ、もとは「外部コード→コントローラーの関数」という呼び出しだったものが「外部コード→コントローラー内のフック関数→同じコントローラーの関数」に変化してしまった結果、(同じクラスなので)privateまで呼び出せるようになってしまい、リフレクションでpublicチェックを入れる、という場面がありました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/03/10 00:23

    maisumakunさん
    回答ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る