Создавать экземпляр класса из строки

В дроти можно создать экземпляр класса из строки?

Например:

  • ваниль в javascript:
var myObject = window[classNameString];
  • Цель-C:
id myclass = [[NSClassFromString(@"MyClass") alloc] init];
8
nl ja de

2 ответы

Синтаксис изменился. Я работал так

library test;

import "dart:mirrors";

class TestClass {
  doStuff() => print("doStuff was called!");
}

main() {
  MirrorSystem mirrors = currentMirrorSystem();
  LibraryMirror lm = mirrors.libraries.values.firstWhere(
      (LibraryMirror lm) => lm.qualifiedName == new Symbol('test'));

  ClassMirror cm = lm.declarations[new Symbol('TestClass')];

  InstanceMirror im = cm.newInstance(new Symbol(''), []);
  var tc = im.reflectee;
  tc.doStuff();
}

Если есть больше библиотек с именем 'test', это не удастся.

4
добавлено
Действительно, classes getter был изменен на declarations .
добавлено автор Greg Kuperberg, источник

Вам нужно знать имя библиотеки и имя класса, чтобы все работало правильно. Предположим, вы знаете оба, приведенный ниже пример будет создавать экземпляр TestClass и вызывать doStuff на нем.

library test;

import "dart:mirrors";

class TestClass {
  doStuff() => print("doStuff was called!");
}

main() {
  MirrorSystem mirrors = currentMirrorSystem();
  LibraryMirror lm = mirrors.libraries['test'];
  ClassMirror cm = lm.classes['TestClass'];
  Future tcFuture = cm.newInstance('', []);
  tcFuture.then((InstanceMirror im) {
    var tc = im.reflectee;
    tc.doStuff();
  });
}

Несколько замечаний об этом решении:

  1. The library test we are trying to load the class from is already imported in the VM, which makes this case a bit easier.
  2. the call the newInstance allows for passing parameters to the constructor. Positional arguments are implemented, but named parameters are not yet implemented (as of the M2 release).
  3. newInstance returns a Future to allow it to work across isolates.
3
добавлено
Примечание: это может не сработать при компиляции в JavaScript. Компилятор dart2js еще не полностью поддерживает зеркала.
добавлено автор Seth Ladd, источник
newInstance не возвращает Future , потому что для создания экземпляра класса может потребоваться операция async, это неверно, все уже загружено. Он возвращает Future , потому что API зеркал преднамеренно асинхронен, так как он будет работать в изолятах в будущем (а межсетевая связь всегда асинхронна). Если вы внимательно проведете вызов newInstance (и другие, такие как get/setField или invoke ), вы заметите, что под капотом это работает синхронно. Это может измениться в будущем.
добавлено автор Ladicek, источник
Ух .. это заставляет Dart выглядеть менее динамично, чем Java .. Отражение - очень важная особенность.
добавлено автор R.Moeller, источник
Спасибо, Ladicek. Я обновил ответ.
добавлено автор Kyrra, источник
Dart & Flutter по-русски
Dart & Flutter по-русски
1 115 участник(ов)

Чат русскоязычного сообщества, посвященный языку Dart и всем что вокруг (Flutter, AngularDart ect) Правила и ответы на частые вопросы: https://github.com/rudart/community