Dart中的反射

先上例子:

import 'dart:mirrors';

class MyClass {
  int i, j;
  void my_method() {  }

  int sum() => i + j;

  MyClass(this.i, this.j);

  static noise() => 42;

  static var s;
}

main() {
  MyClass myClass = new MyClass(3, 4);
  InstanceMirror myClassInstanceMirror = reflect(myClass);

  ClassMirror MyClassMirror = myClassInstanceMirror.type;// 反射MyClass

  InstanceMirror res = myClassInstanceMirror.invoke(#sum, []);
  print('sum = ${res.reflectee}');

  var f = MyClassMirror.invoke(#noise, []);
  print('noise = $f');

  print('nMethods:');
  Iterable<DeclarationMirror> decls =
      MyClassMirror.declarations.values.where(
        (dm) => dm is MethodMirror && dm.isRegularMethod);
  decls.forEach((MethodMirror mm) {
    print(MirrorSystem.getName(mm.simpleName));
  });

  print('nAll declarations:');
  for (var k in MyClassMirror.declarations.keys) {
    print(MirrorSystem.getName(k));
  }

  MyClassMirror.setField(#s, 91);
  print(MyClass.s);
}

输出结果:

sum = 7
noise = InstanceMirror on 42

Methods:
my_method

sum

noise

All declarations:
i
j
s
my_method

sum
noise
MyClass
91

另外,我们可以反射Class

ClassMirror cm = reflectClass(MyClass); // 反射MyClass
//如果我们已经获得了一个类的反射 cm ,我们可以打印 cm 反射的类所有声明的名称。
for (var m in cm.declarations.values) 
  print(MirrorSystem.getName(m.simpleName));

暂无评论

相关推荐

Dart中String使用格式化

在java和OC中,String对象都可以格式化样式,而在Dart 中,我们还需要导入一个三方的库进行这个操作。引用库 dependenc …

Dart中使用单例

class GYDBBaseManager{ static GYDBBaseManager _instance ; static GYDBBaseManager get instance => _getInstanc …

Dart中的隐式接口

先看一下文档的描述:每个类都隐式地定义一个接口,该接口包含类的所有实例成员及其实现的任何接口。如果您想创建一个 …

微信扫一扫,分享到朋友圈

Dart中的反射