【问题标题】:in Dart, using Mirrors, how would you call a class's static method from an instance of the class?在 Dart 中,使用 Mirrors,你将如何从类的实例调用类的静态方法?
【发布时间】:2014-01-11 15:51:12
【问题描述】:

如果我有一个实例,并且我知道该实例的类包含一个名为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?

【问题讨论】:

    标签: class reflection static dart dart-mirrors


    【解决方案1】:

    这应该可以帮助您入门。 findStaticAndInvoke() 查看所提供对象的类及其静态方法或 getter 的子类,并在找到时调用它。

    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, []);
        }
      }
    }
    

    【讨论】:

    • 当您将此类代码转换为 JavaScript 时,摇树可能会丢弃一些函数,因为它无法识别像 new Symbol('someMethod'). To prevent this you can use @MirrorsUsed` 或 @reflectable 这样的引用。如果您在 JavaScript 中收到类似“xxx 没有名为 yyy 的方法”之类的错误,这可能就是原因。
    • 你会在类声明的顶部使用@reflectable 吗?
    • @MirrorsUsesd 之前的 import 'dart:mirrors'; 或 @reflectable 之前的方法/字段。
    猜你喜欢
    • 1970-01-01
    • 2014-10-04
    • 2020-01-22
    • 2012-12-19
    • 2022-10-08
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多