Я использую отражение (aka dart: mirror) в дротике. Во-первых: весь код, видимый здесь, отлично работает в dartium (с родным дартс), но только частично, когда скомпилирован с dart2js и выполняется в хроме.зеркала в дротике не работают для всех элементов
У меня есть класс под названием 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 имен библиотек соответствующего дротик файлов. 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 равны нулю. Что здесь происходит?
Приветствия Cromon
Спасибо за вашу информацию, я принял мой ответ, потому что его решение, пока ваш ответ более очень интересное понимание того, как он не должно быть так, я надеюсь, что это нормально для вас. – Cromon
Мой ответ потребовал разъяснений от экспертов Dart. В настоящее время такие нюансы встречаются повсюду. Существует много примеров, подтверждающих, что даже сами разработчики часто не имеют представления о том, как следует толковать те или иные двусмысленные действия. Чем меньше проблем людей затрагивает меньший интерес, тем больше проявляются разработчики в этой проблеме. Таким образом, вы нашли решение, и это означает, что это не проблема. То есть сама проблема может быть не проблемой, если она по-прежнему не создает экспоненциально других проблем, даже если проблема является неправильным поведением. Это основное правило разработчиков Dart. – mezoni