如何检索声明注释(How to retrieve annotations on declaratio

2019-10-20 04:40发布

根据规范,元数据可以变量声明之前出现。

但是,它并没有说明这是否可以检索任何东西。

const annotation = null;

main() {

  @annotation
  var a = "";
  print(reflect(a) is DeclarationMirror);
}

输出false ;

注释是这样使用的检索可能吗?

Answer 1:

很抱歉的anwser,但实际上,这是不可能做到你想要什么。 理由很简单:你的代码是syntaxicly正确的,但是没有创建注释的实例。

例如:

class Testing {
  Testing(String toPrint) {
    print(toPrint);
  }
}

class annotation {
  final Testing test;
  const annotation(this.test);
}

void main() {
   @annotation(new Testing("Annotation instanciation"))  var a = "hello";

   print(a);
   var annot = new annotation(new Testing("Local instanciation"));
   print(a);
}

这段代码的结果:

$你好

$本地instanciation

$你好

所以注释构造从来没有被调用。

可能是这个功能将在未来增加

资料:其实,它并不在这种情况下,因为它是一个局部变量声明工作。 对于一个函数,类或其他人,它会工作。



Answer 2:

不,这是不可能的。

你是正确的,你需要使用镜子来检索元数据。 细则中指出:

"Metadata can be retrieved at runtime via a reflective call, provided the annotated
 program construct p is accessible via reflection."

不过,也有局部变量(内部函数体中声明的变量)没有镜子,那么它到底是不是通过反射访问。

你只能找到声明说要么是顶层,一类成员或参数的函数的镜子(和,从技术上讲,本地函数声明,但这并不能很好地工作)。



Answer 3:

通过使用currentMirrorSystem().findLibrary我可以检索的库声明的清单。 通过使用new Symbol('')来表示当前无名库,以及全球标识符是访问。 我也能拿main方法,但我无法访问主内的变量。 因此,答案是肯定的部分。

然而,不知ClosureMirror可能是值得考虑的。



Answer 4:

据我所知,这是目前唯一支持的一类或顶级域的领域,但不是一个方法/函数中的局部变量在运行时反映。 也许源镜子具有更多的功能(我没有使用它),但我认为这只能在编译时使用。



文章来源: How to retrieve annotations on declarations