リフレクションとイントロスペクション | Ouobpo

リフレクションとイントロスペクション

 プログラミング言語には、リフレクション(reflection)という仕組みとイントロスペクション(introspection)という仕組みとがある。どちらも、プログラム実行時にオブジェクトの情報を参照するテクニックのことを指す。たとえば、オブジェクトのクラスは何か、オブジェクトにはどんなメソッドが定義されているか、といった情報をプログラム実行中に調べ、それに基づいてなんらかの処理を行なう。

 実際のところ、リフレクションとイントロスペクションとの違いが私にはよく分からない。ネットで調べてみると、以下のような説明が見つけられる。

・リフレクションは、実行時にオブジェクトの情報を参照して、それを元にオブジェクトを操作する方法
・イントロスペクションは、実行時にオブジェクトの情報を参照して、その情報にさらに変更を加える方法

上の説明では、イントロスペクションの方がより強力で、実行時にプログラムそのものを変化させられるものだとしている。Objective-CやSmallTalk、LISPなどの動的なプログラミング言語では、そうしたイントロスペクションがサポートされる。

 Javaに限ると、リフレクションとイントロスペクションとは少し違う意味で使われている。JavaのリフレクションAPIはjava.lang.reflectパッケージにあって、プログラムのメタ情報を取得するプリミティブなAPIを提供している。一方、java.beans.Introspectorというクラスがあって、こちらはJavaBeansに限定して、そのメタ情報を取るためのAPIを提供するものだ。Introspectorクラスの実装には、リフレクションAPIが使われているみたいだ。
 つまり、JavaではリフレクションAPIは、メタ情報取得に関するプリミティブなAPIを提供するもので、イントロスペクションというのはもう少し高次元の自己反映処理を実現するためのもの、という使い分けがされているように見える。したがって、上の説明とは食い違う。

 本当のところ、厳密には両者がどう違うのか、結局よく分からない。

 ちなみにイントロスペクションは、インスペクション(inspection)ともインセプション(inception)ともまったく異なる概念なので要注意のこと。インスペクションとは、設計図やコードを組織的にレビューするための手法のことだ。インセプションとは、オブジェクト指向の開発プロセスRUPで行なわれる一番最初のフェーズ、いわゆる「方向づけ」フェーズのことだ。