多くの場合、ミラーは Java リフレクションとそれほど変わらないと思います。ミラーについて理解する上で最も重要なことは、ミラーがリフレクション API を標準オブジェクト API から分離することです。そのため、obj.getClass() の代わりに、reflect(obj) を使用します。一見小さな違いですが、次のようなメリットがあります。
- オブジェクト API は汚染されておらず、リフレクション メソッドをオーバーライドすることによってリフレクションが壊れる危険はありません。
- 潜在的に異なるミラー システムを持つことができます。たとえば、プライベート メソッドへのアクセスを許可しないものです。これは、ツールにとって非常に便利になる可能性があります。
- ミラー システムを含める必要はありません。JS にコンパイルする場合、これは重要な場合があります。ミラーが使用されていない場合、コードにアクセスするための帯域外はなく、プルーニングが実行可能になります。
- ミラーは、ローカル コードだけでなく、リモート コードでも機能するように作成できます。これは、反射されたオブジェクトがミラーと同じ 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);
}
}