1

DartsMirrors对我来说目前的文档记录很差,而且很难试验——它们在代码中的行为与在控制台中的行为不同。

为了我自己的使用,我希望能够将类(Types)视为树,节点类似于:

class Node {
  type ...  <== Type itself
  name ...  <== name of current class
  super ... <== super of this class, eg, extends super
  mixins ... <== mixins used to build this Type
  extendChildren ... <== Types for which this type is super
  mixinChildren ... <== Types for which this type is a mixin
}

对于我的生活,我无法从当前获得这种基本的东西Mirrors。希望比我聪明的人试一试!!

4

1 回答 1

3

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

于 2013-11-26T06:54:49.670 回答