[解決済み] リフレクションとは何か、なぜ有用なのか?
質問
リフレクションとは何か、なぜ有用なのか?
特に興味があるのは
Java
しかし、その原則はどの言語でも同じだと思います。
どのように解決するのですか?
リフレクションという名前は、同じシステム内の他のコード(またはそれ自身)を検査することができるコードを記述するために使用されます。
例えば、Javaで未知の型のオブジェクトがあり、そのオブジェクトの「doSomething」メソッドが存在すれば呼び出したいとします。Java の静的型付けシステムは、オブジェクトが既知のインターフェイスに準拠しない限り、これをサポートするように設計されていませんが、リフレクションを使用すると、コードはオブジェクトを見て、それが 'doSomething' というメソッドを持っているかどうかを調べ、必要であればそれを呼び出すことができます。
そこで、Javaでこのコード例をあげると(問題のオブジェクトはfooだとします).
Method method = foo.getClass().getMethod("doSomething", null);
method.invoke(foo, null);
Javaで非常に一般的な使用例の1つに、アノテーションを使った使い方があります。例えばJUnit 4はリフレクションを使って、@Testアノテーションでタグ付けされたメソッドをクラスから探し、ユニットテストを実行するときにそれらを呼び出すことができるのです。
リフレクションの良い例がいくつかあります。 http://docs.oracle.com/javase/tutorial/reflect/index.html
そして最後に、リフレクションをサポートする他の静的型付け言語(C#など)でも、コンセプトはほとんど同じです。動的型付け言語では、上記のユースケースはあまり必要ではありませんが(コンパイラは任意のオブジェクト上で任意のメソッドを呼び出すことができ、それが存在しない場合は実行時に失敗するので)、マークされているか特定の方法で動作するメソッドを探すという2番目のケースはまだ一般的です。
コメントからの更新です。
システム内のコードを検査し、オブジェクトの型を見ることができるのは リフレクションではなく、タイプ・イントロスペクション(Type Introspection)です。そして、リフレクションとは を利用して、実行時に修正を加えることができる。 イントロスペクション 言語によっては、以下のように区別する必要があります。 はイントロスペクションをサポートするが、リフレクションはサポートしない。そのような例として はC++です。
関連
-
spring-boot 401 このリソースにアクセスするには完全な認証が必要です エラー解決
-
SocketTimeoutExceptionの解決方法です。読み込みがタイムアウトした
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] JSONPとは何か、なぜ作られたのか?
-
[解決済み] MVPとMVC、その違いは何ですか?
-
[解決済み] JavaBeanとは何ですか?
-
[解決済み] Javaはパラメータのデフォルト値をサポートしていますか?
-
[解決済み] なぜゲッターとセッター/アクセッサーを使うのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
java.util.NoSuchElementException 原因解析と解決方法
-
myeclipseでコンパイルするとAntエラーが発生する javaの例外が発生しました。
-
javaの実行中に「javaの例外が発生しました」と表示された場合はどうすればよいですか?
-
SpringBootApplication を型解決できない。
-
コンストラクタの呼び出しは、コンストラクタのエラー理解の最初のステートメントである必要があります。
-
java Mail send email smtp is not authenticated by TLS encryption solution.
-
javaでクラスを作成すると、enclosing classでないように見える
-
org.glassfish.jersey.servlet.ServletContainer
-
スレッド "main" で例外発生 java.net.BindException: アドレスは既に使用中です。NET_Bind
-
Java(1)仕上げの基本概念+eclipseのインストール構成