我有两节课
class ESVAPI extends BibleProvider {
ESVAPI() : super('esvapi', true, {'esv'});
...methods
}
abstract class BibleProvider {
...fields
BibleProvider(this.name, this._requiresKey, this._versions) {
Bible.addProvider(this, _versions.toList());
}
}
我打算让多个类扩展抽象类,所以我想创建一个方法来创建每个BibleProvider
子类的实例,我在这里创建了一个:
ClassMirror classMirror = reflectClass(BibleProvider);
List<DeclarationMirror> subClassMirrors = currentMirrorSystem()
.libraries
.values
.expand((lib) => lib.declarations.values)
.where((lib) {
return lib is ClassMirror &&
lib.isSubclassOf(classMirror) &&
lib != classMirror;
}).toList();
DeclarationMirror subClassDec = subClassMirrors[0];
ClassMirror ESVCLASS = reflectClass(subClassDec.runtimeType);
var esvObj = ESVCLASS.newInstance(const Symbol(''), []);
但是在ESVCLASS.newInstance
我收到这个异常:
No constructor '_ClassMirror' declared in class '_ClassMirror'
我在想这可能与我如何在构造函数中使用“硬编码”值调用超类有关。如果是这样,是否有一种方法可以调用子类的构造函数并让其调用超级构造函数?我不太确定。任何熟悉反射的人都知道会是什么情况?
将最后三行更改为:
ClassMirror subClassDec = subClassMirrors[0] as ClassMirror;
var esvObj = subClassDec.newInstance(const Symbol(''), []);
...
print(esvObj.reflectee.runtimeType); // ESVAPI
您正在考虑的东西已经是mirror,因此您ESVCLASS
成为该类_ClassMirror
本身的类镜像,而不是BibleProvider
上面找到的您的子类。只需subClassDec
直接使用类镜像。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句