【问题标题】:Obtain getters and/or attributes from ClassMirror using reflection in Dart?使用 Dart 中的反射从 ClassMirror 获取 getter 和/或属性?
【发布时间】:2014-03-11 06:20:35
【问题描述】:

以前版本的 dart 可以使用 getter 方法

cm.getters.values

正如在此答案中发布的那样:https://stackoverflow.com/a/14505025/2117440

但实际版本已被删除并替换为

cm.declarations.values

最后一段代码获取所有属性、getter、setter、方法和构造函数。我想知道是否有一种方法可以只获取“getter and attributes”而不使用其他方法。

我现在使用的代码是那个:

import "dart:mirrors";

class MyNestedClass {
  String name;
}
class MyClass {
  int i, j;
  MyNestedClass myNestedClass;
  int sum() => i + j;

  MyClass(this.i, this.j);
}

void main() {
  MyClass myClass = new MyClass(3, 5)
    ..myNestedClass = (new MyNestedClass()..name = "luis");
  print(myClass.toString());
  InstanceMirror im = reflect(myClass);

  ClassMirror cm = im.type;

  Map<Symbol, MethodMirror> instanceMembers = cm.instanceMembers;

  cm.declarations.forEach((name, declaration) {
      if(declaration.simpleName != cm.simpleName) // If is not te constructor
        print('${MirrorSystem.getName(name)}:${im.getField(name).reflectee}');
  });
}

正如您在前面的代码中看到的,要检查是否不是构造函数,我需要将declaration.simpleNamecm.simpleName 进行比较。直到我明白是低效的,因为我们正在比较字符串。

最后,我想知道是否有或将会有更好的方法来解决这个问题。

【问题讨论】:

    标签: dart dart-mirrors


    【解决方案1】:

    也许有更好的方法,但这应该可以满足您的需求

      cm.declarations.forEach((name, declaration) {
        VariableMirror field;
        if(declaration is VariableMirror) field = declaration;
    
        MethodMirror method;
        if(declaration is MethodMirror) method = declaration;
    
        if(field != null) {
          print('field: ${field.simpleName}');
        } else if(method != null && !method.isConstructor){
          print('method: ${method.simpleName}');
        }
      });
    

    转换为VariableMirrorMethodMirror 后,您可以获得更多属性:

    字段:
    - isConst
    - isFinal
    - 是静态的

    方法:
    - 构造函数名称
    - isConstructor
    - isConstConstructor
    - isFactoryConstructor
    - isGenerativeConstructor
    - isGetter
    - isOperator
    - isRedirectingConstructor
    - isRegularMethod
    - isSetter
    - 静态
    - 是合成的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 2011-10-02
      • 2010-11-14
      相关资源
      最近更新 更多