我有两节课
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
直接使用类镜像。
哦,好吧,使用
as
运算符与强制转换相同吗?我决定不在程序中使用反射,因为我听说它可能非常昂贵,如果我切换回去,这将对您有所帮助,谢谢!该
as
操作符是Dart中的演员表操作符,因此它与演员表绝对相同。