Dart Metadata 使用

Posted 唯夜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dart Metadata 使用相关的知识,希望对你有一定的参考价值。

Dart Metadata 使用

Dart提供了类似于Java注解一样的机制 metadata ,通过使用 metadata 可以实现与注解一样的功能,中文我们称它为元数据。我们来看一段官方的使用描述:

Metadata can appear before a library, class, typedef, type parameter, constructor, factory, function, field, parameter, or variable declaration and before an import or export directive.

这段话是说 Metadata 可以出现在库、类、typedef,参数类型,构造函数,工厂构造函数,方法,字段,参数,或者变量和 import 以及 export 指令前面。可见 metadata 使用范围之广。

Guide

原文档在这里

官方给了我们定义的例子:

Use metadata to give additional information about your code. A metadata annotation begins with the character @, followed by either a reference to a compile-time constant (such as deprecated) or a call to a constant constructor.

Two annotations are available to all Dart code: @deprecated and @override. For examples of using @override, see Extending a class. Here’s an example of using the @deprecated annotation:

class Television 
  /// _Deprecated: Use [turnOn] instead._
  @deprecated
  void activate() 
    turnOn();
  

  /// Turns the TV's power on.
  void turnOn() ...

You can define your own metadata annotations. Here’s an example of defining a @todo annotation that takes two arguments:

library todo;

class Todo 
  final String who;
  final String what;

  const Todo(this.who, this.what);

And here’s an example of using that @todo annotation:

import 'todo.dart';

@Todo('seth', 'make this do something')
void doSomething() 
  print('do something');

Metadata can appear before a library, class, typedef, type parameter, constructor, factory, function, field, parameter, or variable declaration and before an import or export directive. You can retrieve metadata at runtime using reflection.

但是这里并没有说怎么使用 reflection ,下面我们来看看怎么使用反射获取 metadata 。

Mirrors

为了能够使用反射 dart 引入了 mirrors 系统,在 dart:mirrors 包下。这里我们主要讲跟类相关的,包括:

InstanceMirror
ClassMirror
DeclarationMirror
ParameterMirror
MethodMirror
TypeMirror

获取 mirror 的方法:

InstanceMirror reflect(Object)
ClassMirror reflectClass(Type)
TypeMirror reflectType(Type)

下面是一个获取 metadata 的 demo:

main(List<String> args) 
  getWorkAnnotation();


void getWorkAnnotation() 
  ClassMirror classMirror = reflectClass(TestMixin);

  // 获取 class 上的元数据
  classMirror.metadata.forEach((metadata) 
    print(metadata.reflectee.who + ' ==> ' + metadata.reflectee.what);
  );

  // 获取 field 和 method 上的元数据
  classMirror.declarations.forEach((Symbol key, DeclarationMirror value) 
    if (value is MethodMirror) 
      if (value.simpleName == #getRequest) 
        value.metadata.forEach((metadata) 
          if (metadata.reflectee is Todo) 
            print(metadata.reflectee.who + ' ==> ' + metadata.reflectee.what);
           else if (metadata.reflectee is TestAnnotation) 
            print(metadata.reflectee.id.toString() +
                ' ==> ' +
                (metadata.reflectee.name == null
                    ? 'null'
                    : metadata.reflectee.name));
           else if (metadata.reflectee is GET) 
            print(metadata.reflectee.value);
          
        );

        // 获取方法中参数上的元数据
        value.parameters.forEach((param) 
          param.metadata.forEach((metadata) 
            if (metadata.reflectee is Query) 
              if (metadata.reflectee.value == null) 
                print(
                    'args name ==> ' + MirrorSystem.getName(param.simpleName));
               else 
                print(metadata.reflectee.value);
              
            
          );
        );
      
    
  );


@Todo('wyndam', 'work')
abstract class TestMixin 
  @GET(value: 'https://www.baidu.com/')
  void getRequest(@Query(value: 'q') String param);


class GET 
  final String value;

  const GET(this.value);


class Todo 
  final String who;
  final String what;

  const Todo(this.who, this.what);

以上是关于Dart Metadata 使用的主要内容,如果未能解决你的问题,请参考以下文章

错误消息“$.metadata”为空或不是对象。在 jQuery 中使用验证插件

jquery.validata1.11怎么支持metadata

pytest文档43-元数据使用(pytest-metadata)

使用 ALAssetsLibrary 的 writeImageToSavedPhotosAlbum:metadata:completionBlock 复制照片:更改图像方向

ET005 通过 metadata 使logstash配置更简洁

writeImageToSavedPhotosAlbum:metadata:completionBlock: