Как я могу использовать Reflection (Mirrors) для доступа к именам методов в классе Dart?

Мне нужно "выбрать" методы в классе дартс.

Как я могу это сделать?

И я хочу иметь возможность вызывать методы.

Могу ли я увидеть пример?

3 ответа

Решение

Вот простой копируемый пример кода:

import 'dart:mirrors';
import 'dart:io';

main() {
  var im = reflect(new File('test')); // Retrieve the InstanceMirror of some class instance.
  im.type.methods.values.forEach((MethodMirror method) => print(method.simpleName));
}

Выход:

existsSync
_delete
exists
directory
_getDecodedLines
readAsTextSync
readAsBytesSync
readAsLinesSync
_directory
throwIfError
lastModifiedSync
readAsLines
open
_ensureFileService
deleteSync
delete
_exists
length
openInputStream
create
_create
readAsText
_openStdioSync
openOutputStream
_fullPath
_lastModified
fullPathSync
readAsBytes
lastModified
_openStdio
_open
openSync
lengthSync
directorySync
fullPath
createSync
_lengthFromName

Вот основной пример:

(Примечание. Для этого вам понадобится (очень) последняя версия SDK, это было сделано в Dart Editor версии 0.2.1_r14167, Dart SDK версии 0.2.1.2_r14167 2 ноября 2012 г.)

Моя самая искренняя благодарность Гиладу из Google Dart Team за предоставленный пример!

#import('dart:mirrors');

class MyClass {
  String _test;

  String  get test       => _test;
  set     test(String paramVal)  => _test = paramVal;

  void my_method() {
  }

  void print_test(){
    print("test string is: ${_test}");
  }

  MyClass(String test) {
    _test = test;
  }

}


main() {

  MyClass myClass = new MyClass("Make my day, PUNK.");

  myClass.print_test();

  //ClassMirror myClassMirror = reflect(myClass).type;

  InstanceMirror myClassInstanceMirror = reflect(myClass);

  ClassMirror MyClassMirror = myClassInstanceMirror.type;

  Map<String, MethodMirror> map = MyClassMirror.methods;

  print("map = ${map}"); 

  map.values.forEach( (MethodMirror mm){
    myClassInstanceMirror.invoke(mm.simpleName,[]);
  });

}

Что касается Reflection, я только что написал пару "вспомогательных функций" для получения списка имен методов (не Map) и вызова метода... все, что я могу точно сказать, это то, что он работает прямо сейчас. Вероятно, есть технические причины, по которым мы не делаем этого, но в моем случае это не работает в сложной среде. Тем не менее, я думаю, что они хорошо маскируют множество деталей, с которыми не все захотят иметь дело.

Вот демонстрация работы с функциями Helper и без них:

#import('dart:mirrors');

class MyClass {
  String _test;
  String  get test               => _test;
  set     test(String paramVal)  => _test = paramVal;
  void my_method1(){print("in method1");}
  void my_method2(){print("in method2");}
  void print_test(){
    print("test string is: ${_test}");
  }
  MyClass(String test) {
    _test = test;
  }
}

//Helper Methods
InstanceMirror hMr;
List REFLECT_methods(Object myClass) {hMr=reflect(myClass);return(hMr.type.methods.values);}
REFLECT_invoke(MethodMirror mm){hMr.invoke(mm.simpleName, []);}

main() {

  MyClass myClass = new MyClass("Make my day, PUNK.");

  print("\n=======Using Raw Reflection================");
  InstanceMirror myClassInstanceMirror = reflect(myClass);
  ClassMirror MyClassMirror = myClassInstanceMirror.type;
  Map<String, MethodMirror> map1 = MyClassMirror.methods;
  map1.values.forEach( (MethodMirror mm){
    myClassInstanceMirror.invoke(mm.simpleName,[]);
  });

  print("\n==========Using Helper functions=============");
  List list2 = REFLECT_methods(myClass);
  list2.forEach((method){
    REFLECT_invoke(method);
  });  
}
Другие вопросы по тегам