6

私が知り、理解している限りでは、

リフレクションは、実行時にソース コードを作成/変更する機能です。

ウィキペディアから:

  • 実行時にソース コードの構造 (コード ブロック、クラス、メソッド、プロトコルなど) をファーストクラス オブジェクトとして検出して変更します。
  • クラスまたは関数の記号名に一致する文字列を、そのクラスまたは関数への参照または呼び出しに変換します。
  • 実行時にソース コード ステートメントであるかのように文字列を評価します。
    言語のバイトコードの新しいインタープリターを作成して、プログラミング構造に新しい
    意味または目的を与えます。

動的言語は、実行時に評価 (文字列から直接評価) できる言語です。

ウィキペディアから: 「新しいコードの追加、オブジェクトと定義の拡張、または型システムの変更によるプログラムの拡張」

さて、私の質問は次のとおりです。静的言語 (eval 機能なし) はどのようにリフレクション (Java など) を持つことができますか? (新しいソースコードが評価されない? :/)

前もって感謝します!

4

1 に答える 1

4

ウィキペディアの説明はあまりうまく表現されていないと思います。

リフレクション (またはイントロスペクション) は、実行時にコードを作成することではなく、実行時にコード自体を反映する(そして、これに基づいて動作を変更する) 能力に関するものです。例としては、オブジェクトのタイプに関する情報の取得 (C++ の RTTI など) や、オブジェクトに関連付けられたメタデータの取得 (Java の注釈など) があります。

実行時のコード生成は、リフレクションよりもファーストクラス性に関連しているため、現在のウィキペディアの記事は誤解を招くものであると私は主張します。

アップデート

言い換えれば、これに答えます:

さて、私の質問は、どうすれば静的言語 (eval 機能なし) にリフレクション (Java など) を持たせることができるのでしょうか?

……リフレクションはイベル能力に頼らないということだろう。これらは 2 つの別個の言語機能です。

また、Giulio Franco がコメントで指摘したように、Java はランタイム コード生成\操作が可能です (たとえば、 CGLIBを参照)。

于 2013-08-09T18:29:20.850 に答える