标签: dart-mirrors

Dart 通过函数名调用成员函数

我想知道是否可以像在 javascript那样在dart 中名称调用函数。

我想做这样的事情:

foo["bar"]();
Run Code Online (Sandbox Code Playgroud)

dart dart-mirrors

2
推荐指数
1
解决办法
3265
查看次数

获取所有具有注释的类的 ClassMirror 实例

我有这个注释

class Target{
  final String value;
  const Target(this.value);
}
Run Code Online (Sandbox Code Playgroud)

和 2 个用它注释的类

@Target("/313")
class c1{

}

@Target("/314")
class c2{

}
Run Code Online (Sandbox Code Playgroud)

ClassMirror我如何获取具有 Target 注释的类的实例列表?

基于所选的答案,即如果我知道我的课程存在于哪个图书馆

  var mirrorSystem = currentMirrorSystem();
  var libraryMirror = mirrorSystem.findLibrary(#testlib);
  for(ClassMirror classMirror in libraryMirror.declarations.values){
    if(classMirror.metadata!=null){
      for(var meta in classMirror.metadata){
            if(meta.type == reflectClass(Path)){
              print(classMirror.simpleName);
              print(meta.getField(#value));
            }
          }
    }
  }
Run Code Online (Sandbox Code Playgroud)

dart dart-mirrors

2
推荐指数
1
解决办法
973
查看次数

如何在 Dart 类上获得 ClassMirror?

如何使用 Mirrors API 获取 ClassMirror?我尝试使用顶级reflect()函数,但这需要一个类实例,而不是一个类作为参数。

dart dart-mirrors

1
推荐指数
1
解决办法
1368
查看次数

在Dart中,您可以使用反射在运行时检索元数据(例如,注释)吗?

如果是这样,这是如何实现的?如果没有,是否有任何计划在未来的Dart版本中支持这一点?我主要是指你自己创建的自定义注释.

在此文档链接https://www.dartlang.org/docs/spec/latest/dart-language-specification.html#h.d0rowtffuudf中,它说:"元数据与程序构造p的抽象语法树相关联紧接着元数据,假设p本身不是元数据或注释.元数据可以在运行时通过反射调用检索,前提是注释的程序结构p可以通过反射访问.

从M3版本开始,尚未实现对元数据的反射访问."

谢谢.

annotations dart dart-mirrors

1
推荐指数
1
解决办法
1149
查看次数

如何通过Dart中的反射获取构造函数的参数?

我正在玩达特的镜子.我找不到任何方式反映一个类,并弄清楚它是否有一个构造函数,如果有的话,这个构造函数的参数是什么.

使用ClassMirror,看起来StatementMirror对象的"声明"集合将包含构造函数的条目,但是没有办法使用DeclarationMirror来判断它是否是构造函数,并且无法查看有关参数的信息.

使用MethodMirror对象的"instanceMembers"集合,看起来甚至不包含构造函数.我假设这是因为构造函数不是可以调用的正常方法,但是,由于MethodMirror具有"isConstructor"属性,因此它很奇怪.

有没有办法,给定一个对象类型,弄清楚它是否有一个构造函数,如果有的话,获取有关该构造函数的参数信息?

以下代码说明了问题:

import 'dart:mirrors';

class Person {
  String name;
  int age;

  Person(this.name, this.age);

  string getNameAndAge() {
    return "${this.name} is ${this.age} years old";
  }

}

void main() {
  ClassMirror classMirror = reflectClass(Person);

  // This will show me the constructor, but a DeclarationMirror doesn't tell me
  // anything about the parameters.
  print("+ Declarations");
  classMirror.declarations.forEach((symbol, declarationMirror) {
    print(MirrorSystem.getName(symbol));
  });

  // This doesn't show me the constructor
  print("+ Members");
  classMirror.instanceMembers.forEach((symbol, methodMirror) {
    print(MirrorSystem.getName(symbol));
  });
}
Run Code Online (Sandbox Code Playgroud)

dart dart-mirrors

1
推荐指数
1
解决办法
375
查看次数

Dart VM本身在`dart:mirrors`中实现`eval`,开发人员使用它.是否计划将此方法公之于众?

这是eval在Dart平台中使用此方法的代码.

这是通过反射完成的.

运行/ LIB/mirrors_impl.dart

_getFieldSlow(unwrapped) {
      // ..... Skipped  
      var atPosition = unwrapped.indexOf('@');
      if (atPosition == -1) {
        // Public symbol.
        f = _eval('(x) => x.$unwrapped', null);
      } else {
        // Private symbol.
        var withoutKey = unwrapped.substring(0, atPosition);
        var privateKey = unwrapped.substring(atPosition);
        f = _eval('(x) => x.$withoutKey', privateKey);
      }
      // ..... Skipped
  }
Run Code Online (Sandbox Code Playgroud)
  static _eval(expression, privateKey)
      native "Mirrors_evalInLibraryWithPrivateKey";
Run Code Online (Sandbox Code Playgroud)

运行/ LIB/mirrors.cc

DEFINE_NATIVE_ENTRY(Mirrors_evalInLibraryWithPrivateKey, 2) {
  GET_NON_NULL_NATIVE_ARGUMENT(String, expression, arguments->NativeArgAt(0));
  GET_NATIVE_ARGUMENT(String, private_key, arguments->NativeArgAt(1));

  const GrowableObjectArray& libraries =
      GrowableObjectArray::Handle(isolate->object_store()->libraries());
  const int num_libraries = …
Run Code Online (Sandbox Code Playgroud)

eval dynamic-compilation dart dart-mirrors dart-sdk

0
推荐指数
1
解决办法
446
查看次数