Dart 从字符串实例化一个类
在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
- 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();
}