Warm tip: This article is reproduced from serverfault.com, please click

oop-我无法通过调用defaullt构造函数来创建ClassMirror的新实例

(oop - I can't create a new instance of a ClassMirror by calling the defaullt constructor)

发布于 2020-11-30 21:22:57

我有两节课

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'

我在想这可能与如何在构造函数中使用“硬编码”值调用超类有关。如果是这样,是否有一种方法可以调用子类的构造函数并让其调用超级构造函数?我不太确定。任何熟悉反射的人都知道会是什么情况?

Questioner
joshpetit
Viewed
0
lrn 2020-12-02 17:46:48

将最后三行更改为:

  ClassMirror subClassDec = subClassMirrors[0] as ClassMirror;
  var esvObj = subClassDec.newInstance(const Symbol(''), []);
  ...
  print(esvObj.reflectee.runtimeType); // ESVAPI

你正在考虑的东西已经是mirror,因此你ESVCLASS成为该类_ClassMirror本身的类镜像,而不是BibleProvider上面找到的子类只需subClassDec直接使用类镜像。