gpt4 book ai didi

dart - 通过 Dart 中的反射获取私有(private)变量

转载 作者:行者123 更新时间:2023-12-03 03:02:52 34 4
gpt4 key购买 nike

我想在 Dart 的对象中获取私有(private)变量。

这个变量没有 setter/getter ,所以我想通过反射来做到这一点。

我尝试了很多方法,但对我没有任何作用。

例如,当我这样做时:

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

我收到一个错误:

fieldName 没有 getter。
这很正常,因为变量没有 setter/getter 。

我怎样才能得到这个变量?

使用测试代码编辑:

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

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

我收到此错误:

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



如果我这样做:

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

我得到:

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



与声明的值相同。

最佳答案

您收到的错误消息实际上是正确的。该类具有该字段的 setter/getter 。
Dart 为所有非最终/非 const 字段隐式创建 getter 和 setter。

Dart2JS 似乎还不支持访问私有(private)成员。
https://code.google.com/p/dart/issues/detail?id=13881

这是一个如何访问私有(private)字段的示例:
(来自 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 - 通过 Dart 中的反射获取私有(private)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22814817/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com