в Dart, используя Mirrors, как бы вы вызвали статический метод класса из экземпляра класса?

если у меня есть экземпляр, и я знаю, что класс экземпляра содержит статический метод с именем statFn(), как мне вызвать statFn() из экземпляра?

Например,

abstract class Junk {
  ...
}
class Hamburger extends Junk {
  static bool get lettuce => true;
  ...
}
class HotDog extends Junk {
  static bool get lettuce => false;
  ...
}

Junk food; // either Hamburger or Hotdog

// how do you get lettuce of food's type?

person cc young    schedule 23.12.2013    source источник


Ответы (1)


Это должно помочь вам начать. findStaticAndInvoke() просматривает класс предоставленного объекта и его подклассы для статического метода или геттера и вызывает его при обнаружении.

library x;

import 'dart:mirrors';

abstract class Junk {
  static void doSomething() {
    print("Junk.doSomething()");
  }
}

class Hamburger extends Junk {
  static bool get lettuce => true;
}

class HotDog extends Junk {
  static bool get lettuce => false;
}

Junk food; // either Hamburger or Hotdog

void main(List<String> args) {
  Junk food = new HotDog();
  findStaticAndInvoke(food, "doSomething");
  findStaticAndInvoke(food, "lettuce");

  food = new Hamburger();
  findStaticAndInvoke(food, "doSomething");
  findStaticAndInvoke(food, "lettuce");
}

void findStaticAndInvoke(o, String name) {
  ClassMirror r = reflect(o).type;
  MethodMirror sFn;
  var s = new Symbol(name);

  while (sFn == null && r != null) {
    sFn = r.staticMembers[s];
    if(sFn != null) {
      break;
    }
    r = r.superclass;
  }

  if(sFn != null) {
    if(sFn.isGetter) {
      print(r.getField(s).reflectee);
    }
    else {
      r.invoke(s, []);
    }
  }
}
person Günter Zöchbauer    schedule 23.12.2013
comment
Когда вы конвертируете такой код в JavaScript, древовидная тряска может удалить некоторые функции, потому что она не может распознавать ссылки, такие как new Symbol('someMethod'). To prevent this you can use @MirrorsUsed` или @reflectable. Если вы получаете ошибки, такие как «у xxx нет метода с именем yyy» в JavaScript, это, вероятно, причина. - person Günter Zöchbauer; 23.12.2013
comment
вы бы использовали @reflectable в верхней части объявления класса? - person cc young; 23.12.2013
comment
@MirrorsUsesd перед import 'dart:mirrors'; или @reflectable перед методом/полем. - person Günter Zöchbauer; 23.12.2013