在Dart中通过反射获取私有变量 [英] Get private variable by reflection in dart

查看:695
本文介绍了在Dart中通过反射获取私有变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在dart中的对象中获取私有变量。



此变量没有吸气剂,因此我想通过反射来实现。



我尝试了很多方法,但对我无济于事。



例如,当我这样做时:

  var体现= reflect(this); 
InstanceMirror字段= Reflection.getField(new Symbol(fieldName));

我收到错误:



否字段名称的获取器。
这是正常现象,因为变量没有吸气剂。



如何获取此变量?



使用测试代码进行编辑:



这是我的反射测试(测试变量是reflectClass(MyClass))



< pre class = lang-dart prettyprint-override> reflectClass(Injector).declarations.keys.forEach((e)=> test.getField(e,test.type.owner))

我收到此错误:


类'_LocalInstanceMirror'没有实例方法'getField'具有
匹配的参数。


如果执行此操作:

  reflectClass(Injector).declarations.keys.forEach((e)=>测试.getField(e))

我得到:


类'DynamicInjector'没有实例获取器
'_PRIMITIVE_TYPES @ 0x1b5a3f8d'。


声明值相同

解决方案

您收到的错误消息实际上是正确的。该类对此领域有一个吸气剂。
Dart隐式地为所有非final / non-const字段创建getter,并为所有非final / non-const字段创建setter。





Dart2JS尚不支持私有成员。
请参阅 https://code.google.com/p/ dart / issues / detail?id = 13881



以下示例如何访问私有字段:
(来自 https://code.google.com/p/dart/issues/detail?id=16773

  import'dart:mirrors'; 

类ClassWithPrivateField {

字符串_privateField;
}

void main(){

ClassMirror classM = ReflectionClass(ClassWithPrivateField);
Symbol privateFieldSymbol;
符号构造器符号;
用于(classM.declarations.values中的DeclarationMirror声明){
if(声明是VariableMirror){
privateFieldSymbol = clarification.simpleName;
}否则,如果(声明是MethodMirror&& clarification.isConstructor){
constructorSymbol = clarification.constructorName;
}
}

//不必使用反射创建实例就可以
//通过反射访问其成员
InstanceMirror实例= classM.newInstance(constructorSymbol,[]);

// var s = new Symbol(’_ privateField’); //不适用于私有字段

//要为私有字段创建符号,您需要使用库
//如果该类位于主库
中/ / var s = MirrorSystem.getSymbol('_ privateField',currentMirrorSystem()。isolate.rootLibrary);
//或更简单的
// var s = MirrorSystem.getSymbol(’_ privateField’,instance.type.owner);
for(var i = 0; i< 1000; ++ i){
instance.setField(privateFieldSymbol,'test');
print(‘迭代$ {instance.getField(privateFieldSymbol)}’);
}
}


I would like to get private variable in an object in dart.

This variable has no getter so I want to do this with reflection.

I try many way but nothing works to me.

For exemple, when I do this:

var reflection = reflect(this);
InstanceMirror field = reflection.getField(new Symbol(fieldName));

I get an error:

No getter for fieldName. It's normal because the variable hasn't getter.

How can I get this variable ?

EDIT with a test code:

Here is my reflect test (test variable is a reflectClass(MyClass))

reflectClass(Injector).declarations.keys.forEach((e) => test.getField(e, test.type.owner))

I get this error:

Class '_LocalInstanceMirror' has no instance method 'getField' with matching arguments.

If I do this:

reflectClass(Injector).declarations.keys.forEach((e) => test.getField(e))

I get:

Class 'DynamicInjector' has no instance getter '_PRIMITIVE_TYPES@0x1b5a3f8d'.

Same thing with values of declarations.

解决方案

The error message you got is actually correct. The class has a getter for this field. Dart implicitly creates getters for all and setters for all non-final/non-const fields.

It seems access to private members isn't yet supported in Dart2JS. see https://code.google.com/p/dart/issues/detail?id=13881

Here an example how to access private fields: (example from https://code.google.com/p/dart/issues/detail?id=16773)

import 'dart:mirrors';

class ClassWithPrivateField {

  String _privateField;
}

void main() {

  ClassMirror classM = reflectClass(ClassWithPrivateField);
  Symbol privateFieldSymbol;
  Symbol constructorSymbol;
  for (DeclarationMirror declaration in classM.declarations.values) {
    if (declaration is VariableMirror) {
      privateFieldSymbol = declaration.simpleName;
    } else if (declaration is MethodMirror && declaration.isConstructor) {
      constructorSymbol = declaration.constructorName;
    }
  }

  // it is not necessary to create the instance using reflection to be able to
  // access its members with reflection
  InstanceMirror instance = classM.newInstance(constructorSymbol, []);

  // var s = new Symbol('_privateField'); // doesn't work for private fields

  // to create a symbol for a private field you need the library 
  // if the class is in the main library
  // var s = MirrorSystem.getSymbol('_privateField', currentMirrorSystem().isolate.rootLibrary);
  // or simpler
  // var s = MirrorSystem.getSymbol('_privateField', instance.type.owner); 
  for (var i=0; i<1000; ++i) {
    instance.setField(privateFieldSymbol, 'test');
    print('Iteration ${instance.getField(privateFieldSymbol)}');
  }
}

这篇关于在Dart中通过反射获取私有变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆