下面是一个打印超类名称和 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属性。它仍然是实验性的,所以期待这会改变。