1. ホーム
  2. java

[解決済み] リフレクションとは何か、なぜ有用なのか?

2022-03-16 06:09:56

質問

リフレクションとは何か、なぜ有用なのか?

特に興味があるのは 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++です。