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 に答える