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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

7221閲覧

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

ponnjinnla

総合スコア14

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/03/08 14:56

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

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

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

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

わかる方がいましたら教えていただきたです。よろしくお願いします。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

・リフレクションの目的

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

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

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

上記のようにリフレクションは強力な言語機能ですが、コンパイラの支援を受けられないという問題があります。

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

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

・リフレクションの使用されるケース

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

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

投稿2015/03/09 04:24

編集2015/03/09 04:33
yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ponnjinnla

2015/03/09 15:23

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

0

ベストアンサー

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

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

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

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

投稿2015/03/08 15:16

編集2015/03/09 15:31
argius

総合スコア9390

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ponnjinnla

2015/03/09 15:21

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

0

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

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

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

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

投稿2015/03/09 01:13

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ponnjinnla

2015/03/09 15:23

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問