以下は、スーパークラスの名前と Foo のメンバーの名前を出力する簡単な例です。
API は文字列ではなくシンボルを使用することに注意してください。これらは、dart2js がミラーを使用するコードを縮小できるようにするために必要です。少し面倒ですが、コードがクロス ブラウザーで実行され、コンパクトになることを意味します。
シンボルと文字列の間で変換するには、MirrorSystem.getName()とMirrorSystem.getSymbol( ) を参照してください(実際には、今すぐ new Symbol('foo') を使用できると思います)。
また、シンボルに特別なリテラル構文を与える新しい機能が最近追加されたことにも注意してください。最近まで const Symbol('foo') と入力する必要がありましたが、現在は #foo と入力する必要がありました。
ミラーの詳細については、この記事を参照してください。
警告 - 例にはおそらくいくつかのタイプミスがあります。
import 'dart:mirrors';
class Bob {
}
class Foo extends Bob {
String bar = 'jim';
}
main() {
var classMirror = reflectClass(Foo);
print(MirrorSystem.getName(classMirror.superClass.simpleName));
classMirror.declarations.values.forEach((d) => print(MirrorSystem.getName(d.simpleName)));
}
更新:アランが以下に述べたことに基づいています(これもテストされていません):
ソースの例:
library foo;
class B extends A {
}
class A {
}
意味:
List<ClassMirror> findSubClasses(Symbol libraryName, ClassMirror superClass) =>
currentMirrorSystem().findLibrary(libraryName).declarations.values
.where((d) => d is ClassMirror
&& d.superClass.simpleName == superClass.simpleName);
使用法:
var cm = reflectClass(A);
var subclasses = findSubClasses(#foo, cm);
js へのコンパイルに興味がある場合は、試してみるとよい @MirrorsUsed 属性があります。これはまだ実験的なものなので、これが変更されることを期待してください。