标签: dart-mirrors

如何调用类表单dart库字符串或文件

谁调用类表单dart库字符串或文件?

例如

for-load.dart文件

class TestLoad {
  void requestHandler(){
  }
}
Run Code Online (Sandbox Code Playgroud)

然后是main.dart文件

main(){
   //this get load lib
   var lib = currentMirrorSystem().libraries[Uri.parse('dart:core')];
   //who to invoke class form TestLoad or for-load.dart? 
   //like java Class.forName('TestLoad') , nodejs require('for-load')
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

dart dart-mirrors

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

有没有办法动态调用方法或在Dart中的类中设置实例变量?

我希望能够使用Dart类构造函数执行此类操作:

class Model {

  // ... setting instance variables

  Model(Map fields) {
    fields.forEach((k,v) => this[k] = v);
  }

}
Run Code Online (Sandbox Code Playgroud)

显然,这不起作用,因为this没有[]=方法.

有没有办法让它发挥作用,或者它根本不是做事的"飞镖方式"?如果不是,你能告诉我解决这个问题的正确方法吗?

dynamic-method dart dart-mirrors

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

如何使用dart实现委托/代理?

我有两个类ParserProxy,当我从调用的方法Parser,它不存在,它会委托给Proxy类.

我的代码:

class Parser {
    noSuchMethod(Invocation invocation) {
        // how to pass the `invocation` to `Proxy`???
    }
}

class Proxy {
    static String hello() { return "hello"; }
    static String world() { return "world"; }
}
Run Code Online (Sandbox Code Playgroud)

我写的时候:

var parser = new Parser();
print(parser.hello());
Run Code Online (Sandbox Code Playgroud)

它将打印:

hello
Run Code Online (Sandbox Code Playgroud)

proxy delegates nosuchmethod dart dart-mirrors

4
推荐指数
2
解决办法
2535
查看次数

如何使用Dart中的镜像获取泛型类型变量的具体类型?

假设我有一个ListString这样的.

var myList = new List<String>();
Run Code Online (Sandbox Code Playgroud)

我怎样才能弄清楚,myListListString使用镜子S'


我尝试使用它typeVariables,ClassMirror但镜像似乎只是描述了泛List类.

InstanceMirror im = reflect(myList); // InstanceMirror on instance of 'List'
ClassMirror cm = im.type; // ClassMirror on 'List'
print(cm.typeVariables['E']) // TypeVariableMirror on 'E'
Run Code Online (Sandbox Code Playgroud)

我也在文档中找到了这个,但我还没有找到一个ClassMirror访问originalDeclaration不会抛出的实例NoSuchMethodError.

最终的ClassMirror originalDeclaration

这种类型的原始声明上的镜像.

对于大多数课程,他们是他们自己的原始声明.但是,对于泛型类,原始类声明(具有未绑定的类型变量)和泛型类(具有绑定类型变量的实例化)之间存在区别.

generics dart dart-mirrors

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

如果存在,则调用方法

是否有一个简单,轻量级/廉价的调用来确定对象是否支持命名方法?所以,在这个obj.respondsTo会很棒.

dynamic _toJson(dynamic obj) {
  return obj.respondsTo('toJson'))? obj.toJson() : obj;
}

class Foo {
  String foo = "Foo.foo";
  Bar bar = new Bar();
  Map toJson() {
    return {
      "foo" : _toJson(foo),
      "bar" : _toJson(bar)
    };
  }
}
Run Code Online (Sandbox Code Playgroud)

一种替代方法是调用它并捕获noSuchMethod异常,但我认为这是不好的做法而且价格昂贵?

dart dart-mirrors

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

是否可以通过名称获取类镜像?

假设我定义了一个app包含一些类的库:

library app;

class User {
    // some members
}
class Question {}
class Answer {}
Run Code Online (Sandbox Code Playgroud)

是否可以获取按名称指定的类的镜像?

var className = specifyClassName(); // may be "User", "Question", etc
ClassMirror cm = getClassMirror(className);
Run Code Online (Sandbox Code Playgroud)

dart dart-mirrors

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

如何在Dartlang中检索元数据?

Dartlang教程介绍包:meta https://www.dartlang.org/docs/dart-up-and-running/contents/ch02.html#ch02-metadata

DartEditor识别上面教程中显示的元数据.本教程还介绍了如何创建自定义元数据并检索它.但是没有关于如何检索它的代码示例.

dart dart-mirrors

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

需要Dart镜像instantiate()函数

为我的生活增添一些理智,为instantiate()Dart的mirror图书馆寻找函数作为语法糖: instantiate( class|type|instance, argArray )

class Klass {
  int i1;
  Klass( int i1 ) {
    this.i1 = (i1 is int) ? i1 : 0;
  }
}
type ktype = Klass;
Klass kinstance = new Klass( 5 );

Klass test1 = instantiate( Klass, [5] );
Klass test2 = instantiate( ktype, [5] );
Klass test3 = instantiate( kinstance, [5] );
Run Code Online (Sandbox Code Playgroud)

目前90%的我的互动mirrors将被这一功能所覆盖.目前盲目地削减和复制出纯粹的愚蠢.当然比我聪明的人已经做到了!


这是instantiate( type, [constructor, positional, named] )所有场合:

  • 构造函数,位置和命名的参数都是可选的
  • type可以是Type实例化类型,也可以是类型的字符串表示形式
  • 构造函数:例如,new Map.from(...) - …

dart dart-isolates dart-mirrors

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

Dart镜像行为是不允许从其他库保证调用私有方法和部分规范?

如果我有2个文件:

bin.dart:

import 'lib.dart';
import 'dart:mirrors';

/*
class Foo{
  bool _bar() => true;
}
*/

void main() {
  var foo = new Foo();
  print(reflect(foo).invoke(#_bar, []));
}
Run Code Online (Sandbox Code Playgroud)

lib.dart:

library lib;

class Foo{
  bool _bar() => true;
}
Run Code Online (Sandbox Code Playgroud)

如果我运行bin.dart,我会得到我希望发生的事情,尝试调用私有方法时会出现异常.但是如果我注释掉该import 'lib.dart'行并取消注释本地Foo定义,这个timeit运行无例外,我想这是好的,因为现在从声明库中调用了私有方法.所以我的问题是,行为是否得到保证?我需要确保通过我的库中的镜像调用点不允许从其他库调用私有成员,目前我通过检查以_开头的名称来明确检查:

if(MirrorSystem.getName(inv.method).startsWith('_')){
  throw new RestrictedMethodError(inv.method);
}else{
  _this.invoke(inv.method, inv.posArgs, inv.namArgs);
}
Run Code Online (Sandbox Code Playgroud)

但是,如果默认情况下仍然尊重隐私,那么我可以摆脱这个检查并删除我的库中的dart:mirror的导入,谢谢.

UPDATE

如果inv.method保证符号始终来自以下内容,该怎么办?

inv.method = MirrorSystem.getSymbol(stringName);
Run Code Online (Sandbox Code Playgroud)

这会阻止在文件dart:mirrors-patch_mirrors_patch.dart行92中调用私有方法:

  static Symbol getSymbol(String name,[LibraryMirror library]) {
    if((library != null && library is !_LocalLibraryMirror) ||
       ((name.length > 0) && (name[0] == …
Run Code Online (Sandbox Code Playgroud)

dart dart-mirrors

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

获取类的公共静态字段/属性的值,它的名称为dart中的字符串,通过reflectable

说我有一节课:

class Icons {
       static const IconData threesixty = IconData(0xe577, fontFamily: 'MaterialIcons');
 }
Run Code Online (Sandbox Code Playgroud)

现在我有一个值为"threesixty"的字符串变量:

String fieldName = "threesixty";
Run Code Online (Sandbox Code Playgroud)

如何通过fieldName变量获取Icons类中的threesixty值?

我正在使用可反射的包,已经使用了ClassMirrors的其他功能,但不知道如何做到这一点.

reflection dart dart-mirrors flutter

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