我在飞镖中使用反射(又名飞镖:镜子)。首先:这里看到的所有代码都在 dartium 中完美运行(使用 dart 本机),但仅在使用 dart2js 编译并在 chrome 中运行时部分运行。
我有一个名为 BinaryReader 的类,而不是从字节流中读取一个类。这是执行此操作的代码(去掉了重复部分):
void readObject(dynamic obj) {
var inst = reflect(obj);
inst.type.declarations.forEach((Symbol name, DeclarationMirror decl) {
if(decl is VariableMirror) {
var variable = decl;
if(variable.metadata.length == 0) {
return;
}
InstanceMirror attrib = variable.metadata.first;
if(attrib.hasReflectee == false) {
return;
}
if(attrib.reflectee is Field) {
var field = attrib.reflectee as Field;
var value;
switch(field.type) {
case I8:
value = getInt8();
break;
// ...
case V3:
value = new Vector3(getFloat(), getFloat(), getFloat());
break;
default:
value = null;
break;
}
if(value == null) {
return;
}
inst.setField(name, value);
}
}
});
}
导入镜像的方式如下:
import 'model/M4SubMesh.dart';
import 'model/M4Model.dart';
import 'package:vector_math/vector_math.dart';
@MirrorsUsed(targets: const["M4SubMesh", "M4Model", "vector_math"], override: '*')
import 'dart:mirrors';
M4SubMesh 和 M4Model 是各自 dart 文件的库名称。vector_math vector_math.dart 之一
起初,我从流中读取了一个 M4Header 实例,它是 M4Model 库的一部分。所有值都是正确的,如下所示:
class M4Header
{
@Field(UI32)
int Signature;
@Field(UI32)
int Version;
@Field(UI32)
int numSubMeshes;
@Field(UI32)
int ofsSubMeshes;
}
然后稍后我尝试读取如下所示的 M4SubMeshHeader:
class M4SubMeshHeader
{
@Field(UI32)
int gridX, gridY, gridZ;
@Field(F32)
num blockSize;
@Field(V3)
Vector3 bboxMin, bboxMax;
}
读取后,blockSize 有一个随机值。bboxMin 和 bboxMax 为空。这里出了什么问题?
问候克罗蒙