14

Dart のような一部の言語はミラー ベースのリフレクションを使用します。簡単に言えば、C# や Java で見られるような実装と従来のリフレクションの違いは何ですか。

更新: Newspeak でミラーベースのリフレクションに関する Gilad Bracha による素晴らしい (そしてやや風変わりな) ビデオを見つけました。 http://www.hpi.uni-potsdam.de/hirschfeld/events/past/media/100105_Bracha_2010_LinguisticReflectionViaMirrors_HPI.mp4 (ミラー関連は 7:42 から開始)

4

3 に答える 3

23

多くの場合、ミラーは Java リフレクションとそれほど変わらないと思います。ミラーについて理解する上で最も重要なことは、ミラーがリフレクション API を標準オブジェクト API から分離することです。そのため、obj.getClass() の代わりに、reflect(obj) を使用します。一見小さな違いですが、次のようなメリットがあります。

  1. オブジェクト API は汚染されておらず、リフレクション メソッドをオーバーライドすることによってリフレクションが壊れる危険はありません。
  2. 潜在的に異なるミラー システムを持つことができます。たとえば、プライベート メソッドへのアクセスを許可しないものです。これは、ツールにとって非常に便利になる可能性があります。
  3. ミラー システムを含める必要はありません。JS にコンパイルする場合、これは重要な場合があります。ミラーが使用されていない場合、コードにアクセスするための帯域外はなく、プルーニングが実行可能になります。
  4. ミラーは、ローカル コードだけでなく、リモート コードでも機能するように作成できます。これは、反射されたオブジェクトがミラーと同じ Isolate または VM にある必要がないためです。

オブジェクトのメソッドを取得するためにミラーが Java および Javascript のリフレクションとどのように異なるかを次に示します。

ジャワ:

myObject.getClass().getMethods(); // returns an array

ダーツ:

reflect(myObject).type.methods; // returns a map

Javascript:

var methods = [];
for (var m in myObject) {
  if (typeof m === 'function') {
    methods.push(m);
  }
}
于 2012-08-27T17:01:47.850 に答える
5

あなたの最善の策は、Dart の共同設計者で仕様書の作成者であるGilad Bracha によるこの記事です。ざっと見るには、おそらく最初の章を読むだけで十分でしょう。

抽象的な主張は、ミラーが従来のリフレクションでは守られていない 3 つの必要な原則に準拠していると主張しています。

オブジェクト指向プログラミング言語におけるリフレクションおよびメタプログラミング機能の 3 つの設計原則を特定します。 カプセル化: メタレベルの機能は、その実装をカプセル化する必要があります。 階層化:メタレベルの機能は、ベースレベルの機能から分離する必要があります。 存在論的対応:メタレベル機能のオントロジーは、それらが操作する言語のオントロジーに対応する必要があります。従来の/主流のリフレクティブ アーキテクチャは、これらの原則に従っていません。対照的に、ミラーの概念に基づいて構築されたリフレクティブ API は、これら 3 つの原則に準拠しているという特徴があります。

于 2012-08-26T19:18:34.673 に答える
1

また、Giladによるこの他の最近の回答を指摘します。ここでは、他の優れた参考資料をリストしています。ミラーAPIを介して静的メソッドの具体的なオブジェクトを取得する方法は?

于 2012-08-26T20:37:37.033 に答える