1

もしそうなら、これはどのように達成されますか?そうでない場合、今後の Dart リリースでこれをサポートする予定はありますか? 私は主に、独自に作成したカスタム注釈について言及しています。

このドキュメント リンクhttps://www.dartlang.org/docs/spec/latest/dart-language-specification.html#h.d0rowtffuudfでは、「メタデータは、プログラム コンストラクト p の抽象構文ツリーに関連付けられています。 p 自体がメタデータでもコメントでもないと仮定すると、メタデータの直後に続く . メタデータは、リフレクションを介して注釈付きプログラム構造 p にアクセスできる場合、リフレクション呼び出しを介して実行時に取得できます。

M3 リリースの時点では、メタデータへのリフレクティブ アクセスはまだ実装されていません。"

ありがとうございました。

4

2 に答える 2

7

理解のためのサンプルコード。

import "dart:mirrors";

void main() {
  var object = new Class1();
  var classMirror = reflectClass(object.runtimeType);
  // Retrieve 'HelloMetadata' for 'object'
  HelloMetadata hello = getAnnotation(classMirror, HelloMetadata);
  print("'HelloMetadata' for object: $hello");

  // Retrieve 'Goodbye' for 'object.method'
  var methodMirror = (reflect(object.method) as ClosureMirror).function;
  Goodbye goodbye = getAnnotation(methodMirror, Goodbye);
  print("'Goodbye' for object: $goodbye");

  // Retrieve all 'Goodbye' for 'object.method'
  List<Goodbye> goodbyes = getAnnotations(methodMirror, Goodbye);
  print("'Goodbye's for object.method': $goodbyes");

  // Retrieve all metadata for 'object.method'
  List all = getAnnotations(methodMirror);
  print("'Metadata for object.method': $all");
}

Object getAnnotation(DeclarationMirror declaration, Type annotation) {
  for (var instance in declaration.metadata) {
    if (instance.hasReflectee) {
      var reflectee = instance.reflectee;
      if (reflectee.runtimeType == annotation) {
        return reflectee;
      }
    }
  }

  return null;
}

List getAnnotations(DeclarationMirror declaration, [Type annotation]) {
  var result = [];
  for (var instance in declaration.metadata) {
    if (instance.hasReflectee) {
      var reflectee = instance.reflectee;
      if (annotation == null) {
        result.add(reflectee);
      } else if (reflectee.runtimeType == annotation) {
        result.add(reflectee);
      }
    }
  }

  return result;
}

@HelloMetadata("Class1")
class Class1 {
  @HelloMetadata("method")
  @Goodbye("method")
  @Goodbye("Class1")
  void method() {
  }
}

class HelloMetadata {
  final String text;
  const HelloMetadata(this.text);
  String toString() => "Hello '$text'";
}

class Goodbye {
  final String text;
  const Goodbye(this.text);
  String toString() => "Goodbye '$text'";
}

出力:

'HelloMetadata' for object: Hello 'Class1'
'Goodbye' for object: Goodbye 'method'
'Goodbye's for object.method': [Goodbye 'method', Goodbye 'Class1']
'Metadata for object.method': [Hello 'method', Goodbye 'method', Goodbye 'Class1']

PS

Dart がこのコードを使用することをお勧めする一般的なメソッドをサポートしていた場合。

T getAnnotation<T>(DeclarationMirror declaration) {
  for (var instance in declaration.metadata) {
    if (instance.hasReflectee) {
      var reflectee = instance.reflectee;
      if (reflectee.runtimeType == T) {
        return reflectee;
      }
    }
  }

  return null;
}

そして、汎用メソッドでメタデータを取得します。

var goodbye = getAnnotation<Goodbye>(methodMirror);
于 2014-03-30T07:44:14.627 に答える
2

はい、 dart:mirrorsで注釈を取得できます:

import 'dart:mirrors';

@override
class A {}

main(){
  TypeMirror typeOfA = reflectType(A);
  // or reflectType(a.runtimeType) if a is an instance of A

  // getting metadata of the class
  List<InstanceMirror> metadatas = typeOfA.metadata;
  for (InstanceMirror m in metadatas) {
    ClassMirror cm = m.type;
    // here you get the Class of the annotation
  }
}
于 2014-03-31T10:58:02.963 に答える