根据规范,元数据可以变量声明之前出现。
但是,它并没有说明这是否可以检索任何东西。
const annotation = null;
main() {
@annotation
var a = "";
print(reflect(a) is DeclarationMirror);
}
输出false
;
注释是这样使用的检索可能吗?
根据规范,元数据可以变量声明之前出现。
但是,它并没有说明这是否可以检索任何东西。
const annotation = null;
main() {
@annotation
var a = "";
print(reflect(a) is DeclarationMirror);
}
输出false
;
注释是这样使用的检索可能吗?
很抱歉的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
$你好
所以注释构造从来没有被调用。
可能是这个功能将在未来增加
资料:其实,它并不在这种情况下,因为它是一个局部变量声明工作。 对于一个函数,类或其他人,它会工作。
不,这是不可能的。
你是正确的,你需要使用镜子来检索元数据。 细则中指出:
"Metadata can be retrieved at runtime via a reflective call, provided the annotated
program construct p is accessible via reflection."
不过,也有局部变量(内部函数体中声明的变量)没有镜子,那么它到底是不是通过反射访问。
你只能找到声明说要么是顶层,一类成员或参数的函数的镜子(和,从技术上讲,本地函数声明,但这并不能很好地工作)。
通过使用currentMirrorSystem().findLibrary
我可以检索的库声明的清单。 通过使用new Symbol('')
来表示当前无名库,以及全球标识符是访问。 我也能拿main
方法,但我无法访问主内的变量。 因此,答案是肯定的部分。
然而,不知ClosureMirror
可能是值得考虑的。
据我所知,这是目前唯一支持的一类或顶级域的领域,但不是一个方法/函数中的局部变量在运行时反映。 也许源镜子具有更多的功能(我没有使用它),但我认为这只能在编译时使用。