通过dart中的反射获取私有变量
我想在dart中的对象中获取私有变量 这个变量没有getter,所以我想用反射来实现 我试了很多方法,但都不管用 例如,当我这样做时:通过dart中的反射获取私有变量,dart,dart-mirrors,Dart,Dart Mirrors,我想在dart中的对象中获取私有变量 这个变量没有getter,所以我想用反射来实现 我试了很多方法,但都不管用 例如,当我这样做时: var反射=反射(此); InstanceMirror字段=reflection.getField(新符号(字段名)); 我得到一个错误: fieldName没有getter。 这是正常的,因为变量没有getter 我怎样才能得到这个变量 使用测试代码编辑: 这是我的reflect测试(测试变量是reflectClass(MyClass)) reflectCl
var反射=反射(此);
InstanceMirror字段=reflection.getField(新符号(字段名));
我得到一个错误:
fieldName没有getter。
这是正常的,因为变量没有getter
我怎样才能得到这个变量
使用测试代码编辑:
这是我的reflect测试(测试变量是reflectClass(MyClass))
reflectClass(Injector).declarations.keys.forEach((e)=>test.getField(e,test.type.owner))
我得到这个错误:
类“\u LocalInstanceMirror”没有具有
匹配参数
如果我这样做:
reflectClass(Injector).declarations.keys.forEach((e)=>test.getField(e))
我得到:
类“DynamicInputor”没有实例getter
“"_TYPES@0x1b5a3f8d"
声明的值也是如此。您得到的错误消息实际上是正确的。该类具有此字段的getter。 Dart隐式地为所有字段创建getter,为所有非final/non const字段创建setter Dart2JS似乎还不支持访问私有成员。 看 下面是如何访问专用字段的示例: (示例来自)
导入“dart:mirrors”;
类带有privateField{
字符串_privateField;
}
void main(){
ClassMirror classM=反射类(ClassWithPrivateField);
符号私有字段符号;
符号构造符号;
for(classM.declarations.values中的DeclarationMirror声明){
if(声明为VariableMirror){
privateFieldSymbol=declaration.simpleName;
}else if(声明为MethodMirror&&declaration.isConstructor){
constructorSymbol=declaration.constructorName;
}
}
//不必使用反射创建实例,就可以
//通过反射访问其成员
InstanceMirror实例=classM.newInstance(构造函数符号,[]);
//var s=新符号(“_privateField”);//不适用于私有字段
//要为专用字段创建符号,需要库
//如果类位于主库中
//var s=MirrorSystem.getSymbol(“'u privateField',currentMirrorSystem().isolate.rootLibrary”);
//或者更简单
//var s=MirrorSystem.getSymbol(“'u privateField',instance.type.owner”);
对于(var i=0;i使用,或者您可以用下一种方法执行:
library example_lib;
import 'package:dson/dson.dart';
// this should be the name of your file
part 'example.g.dart';
@serializable
class Example extends _$ExampleSerializable {
var _privateVar;
}
main() {
var example = new Example();
example['_privateVar'] = 'some value';
print('example._privateVar: ${example._privateVar}');
print('example["_privateVar"]: ${example["_privateVar']}");
}
糟糕的是,它不起作用,可能是我做错了什么。我用我的代码编辑我的帖子声明中的键对我也不起作用(相同的错误)。但是使用声明.simpleName
或其他两个(注释掉的)变体之一为私有字段创建符号对我有效。你看到了吗?