リフレクションは,プログラムの中でそのプログラムに含まれる型や変数/メソッドの情報を参照/操作できるようにする仕組みです。Javaではjava.lang.reflectパッケージに,.NET FrameworkではSystem.Reflection名前空間に,それぞれリフレクションを利用するためのクラスが用意されています。Ruby,Python,PHP(PHP:Hypertext Preprocessor)などのスクリプト言語も,リフレクションの機能を備えています。

 通常の(リフレクションを用いない)プログラミングでは,プログラムの実行中にそのプログラムで使われている変数名や型名などの情報にアクセスすることはありません。あるクラスにどのような変数/メソッドが実装されているかは,ソースコードを書くときにプログラマ自身が(リファレンス・マニュアルや統合開発環境の助けを借りて)調べて,記述します。一方,リフレクションを用いると,このような情報をプログラムの中で取得したり操作したりすることができます。

 例えばJavaのクラス・ファイルや,.NET Frameworkのアセンブリ・ファイルを読み込んで,その中で定義されているクラスのインスタンスを生成したり,そのクラス(インスタンス)内で定義されているメンバー名の一覧を文字列として取得,その文字列のメソッドを呼び出すといったことができます。

 こうした機能は,プログラムの構造や動作を実行時に動的に切り替えたい場合に非常に役に立ちます。例えば,アプリケーションの起動時に機能を拡張するプラグインを動的に読み込んで登録するといった機能はリフレクションを使うと簡単に実現できます。

 このように,リフレクションを使うと通常のプログラムでは不可能であったり,可能であっても煩雑な手順が必要になる機能を簡潔に記述できることがあります。半面,リフレクションは通常のプログラムからは隠されている情報(「メタ情報」などと呼びます)にアクセスする機能であるため,プログラムの見通しを悪くする原因にもなり得ます。効果的に利用するには長所短所を十分に理解する必要があります。