這是真正獲得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來返回有意義的錯誤消息。 再次感謝! –