这是真正获得Dart中注释的simpleName
的唯一方法吗?DartLang中注释的简单名称,带有可反射的元素
// Annotate with this class to enable reflection.
class Reflector extends Reflectable {
const Reflector()
: super(
invokingCapability,metadataCapability
);
}
const reflector = const Reflector();
// Reflector for annotation
class MetaReflector extends Reflectable {
const MetaReflector()
: super(metadataCapability);
}
const metareflector = const MetaReflector();
@metareflector
class MyAnnotation {
final String name;
const MyAnnotation(this.name);
}
@reflector // This annotation enables reflection on A.
class A {
final int a;
A(this.a);
int valueFunction() => a;
int get value => a;
@MyAnnotation("James Bond")
String nameFunction() => "Mike";
}
最后一行返回SimpleName - 看起来有点复杂?
test('> Annotation',() {
final A a = new A(10);
final InstanceMirror im = reflector.reflect(a);
final ClassMirror cm = im.type;
Map<String, MethodMirror> instanceMembers = cm.instanceMembers;
expect(instanceMembers.keys.contains("valueFunction"),isTrue);
expect(instanceMembers.keys.contains("value"),isTrue);
expect(instanceMembers.keys.contains("nameFunction"),isTrue);
final MethodMirror mm = instanceMembers["nameFunction"];
expect(mm.isRegularMethod,isTrue);
expect(mm.metadata.length,1);
final x = mm.metadata.first;
expect(x,new isInstanceOf<MyAnnotation>());
expect((x as MyAnnotation).name,"James Bond");
final InstanceMirror imAnnotation = metareflector.reflect(x);
final ClassMirror cmAnnotation = imAnnotation.type;
expect(cmAnnotation.simpleName,"MyAnnotation");
}); // end of 'Annotation' test
谢谢埃里克,非常有帮助! expect(x,new isInstanceOf());只是为了测试理论与现实的对比。 我最后的做法更具活力。我正在使用lib来验证对象成员。像这样:@EMail(message:const L10N(“{{value}}不是有效的电子邮件地址”)) String username; 而且如果违规失败,我需要type/simpleName来返回有意义的错误消息。 再次感谢! –