Dart 从字符串实例化一个类

Dart 从字符串实例化一个类,dart,dart-mirrors,Dart,Dart Mirrors,在dart中,是否可以从字符串实例化类 例如: javascript中的香草: var myObject=window[classNameString]; 目标C: id myclass=[[NSClassFromString(@“myclass”)alloc]init]; 您需要知道库名和类名才能正常工作。假设您都知道,下面的示例将实例化TestClass,并对其调用doStuff 库测试; 导入“省道:镜像”; 类TestClass{ doStuff()=>打印(“调用了doStu

在dart中,是否可以从字符串实例化类

例如:

  • javascript中的香草:
var myObject=window[classNameString];
  • 目标C:
id myclass=[[NSClassFromString(@“myclass”)alloc]init];

您需要知道库名和类名才能正常工作。假设您都知道,下面的示例将实例化
TestClass
,并对其调用
doStuff

库测试;
导入“省道:镜像”;
类TestClass{
doStuff()=>打印(“调用了doStuff!”);
}
main(){
镜像系统镜像=当前镜像系统();
LibraryMirror lm=mirrors.libraries['test'];
ClassMirror cm=lm.classes['TestClass'];
Future-tcFuture=cm.newInstance(“”,[]);
tcFuture.then((InstanceMirror im){
var tc=im.reflectee;
tc.doStuff();
});
}
有关此解决方案的一些注意事项:

  • 我们试图从中加载类的库
    test
    已经导入到虚拟机中,这使得这种情况更加容易
  • 调用
    newInstance
    允许将参数传递给构造函数。位置参数已实现,但命名参数尚未实现(从M2版本开始)
  • newInstance
    返回一个值,以允许它跨
  • 语法已更改。 我是这样工作的

    库测试;
    导入“省道:镜像”;
    类TestClass{
    doStuff()=>打印(“调用了doStuff!”);
    }
    main(){
    镜像系统镜像=当前镜像系统();
    LibraryMirror lm=mirrors.libraries.values.firstWhere(
    (LibraryMirror lm)=>lm.qualifiedName==新符号(“测试”);
    ClassMirror cm=lm.declarations[新符号('TestClass')];
    InstanceMirror im=cm.newInstance(新符号(“”),[]);
    var tc=im.reflectee;
    tc.doStuff();
    }
    

    如果有更多名为“test”的库,这将失败。

    这个问题一直困扰着我,直到我发现我可以实现一个粗糙的from方法来处理编码Json对象/字符串或Dart映射到所需类的转换

    下面是一个简单的示例,它还处理空值并接受JSON(作为字符串参数)

    下面是它的实现

     PaymentDetail payDetail =  new PaymentDetail().from(object: new Map());
    
     PaymentDetail otherPayDetail =  new PaymentDetail().from(object: {"AccountNumber": "1234", "Amount": 567.2980908});
    
    同样,在整个项目中进行克隆既简单又繁琐,但它适用于简单的情况。

    尝试:

    Map models = {"Player": Player.instatiate};
    var player = models["Player"]();
    
    class Player{
      static instatiate() => Player();
    }
    

    newInstance
    不会返回
    Future
    ,因为实例化类可能需要异步操作,但事实并非如此,所有内容都已加载。它返回一个
    Future
    ,因为镜像API有意是异步的,因为它将在将来跨隔离工作(并且交叉隔离通信始终是异步的)。如果仔细检查
    newInstance
    调用(以及其他类似
    get/setField
    invoke
    的调用),您会注意到在引擎盖下,它是同步工作的。这在将来可能会发生明显的变化。dart2js编译器尚未完全支持mirrors.uh。。这使得Dart看起来不像Java那样动态。。反射是一个非常重要的特性。事实上,
    classes
    getter已经被更改为
    declarations
    Map models = {"Player": Player.instatiate};
    var player = models["Player"]();
    
    class Player{
      static instatiate() => Player();
    }