リフレクションとevalに関する世界観です。オブジェクト指向も参照のこと。
リフレクションは、プログラムコード自体の構造や情報にプログラムから動的にアクセスする機能。
たとえば、文字列からメソッド名を読み取って動的に異なるメソッドを実行したり、プログラム内のメソッドの定義情報にアクセスしたり、メソッドの定義情報を変えたり、プログラムコードを書き換えたり、時にはプログラムコード自体を実行中に組み立てて実行したりすることができる。
リフレクションは、JavaやRubyのようなインタプリタ式の言語においてサポートされていることが多い。リフレクションがサポートされている言語では、デバッガやIDE(統合開発環境)を容易に作りやすくなる。
C言語のようなコンパイラ式の言語では、コンパイルした時点でもともとの関数定義情報などが失われてしまう。しかしながら、GCCなどの多くのCコンパイラでは、DEBUGビルドをサポートしており、コンパイル時にデバッグのためのシンボル情報を付加することで、gdbなどのデバッガでデバッグを行うことができる。
Javaのリフレクションは以下のようになる。
Javaクラスライブラリも参照のこと。
Lispなどの言語では、文字列をLispなどの式として評価・実行するeval()が提供されている。eval()はPerlやPythonでも使用することができる。
後日注記:eval()は与えられた文字列をプログラミング言語のコードとして実行することのできる機能で、インタープリタ言語に多く備わっている。簡易的なテンプレートエンジンにも使えるが、単純に変数の値を埋め込んだ文字列として扱うよりも実行効率は悪く、また入力した文字列をなんでも評価するようにするとセキュリティホールに繋がるので、eval()の乱用は注意が必要。Lispはコンパイル言語だが、eval()によってインタープリタ言語として使うこともできる。
2023.03.08編集
リフレクションはクラスや関数の定義情報などを実行時に動的に取得したり書き換えたりする。
eval()は文字列の内容を式として評価・実行する。