Программирование дротиков - символ
Символы в Dart - это непрозрачное динамическое строковое имя, используемое для отображения метаданных из библиотеки. Проще говоря, символы - это способ сохранить связь между строкой, читаемой человеком, и строкой, оптимизированной для использования компьютерами.
Отражение - это механизм для получения метаданных типа во время выполнения, таких как количество методов в классе, количество конструкторов, которые он имеет, или количество параметров в функции. Вы даже можете вызвать метод того типа, который загружается во время выполнения.
В отражении Dart определенные классы доступны в dart:mirrorsпакет. Эта библиотека работает как в веб-приложениях, так и в приложениях командной строки.
Синтаксис
Symbol obj = new Symbol('name');
// expects a name of class or function or library to reflect
В name должно быть действительным именем общедоступного члена Dart, именем общедоступного конструктора или именем библиотеки.
пример
Рассмотрим следующий пример. Код объявляет классFoo в библиотеке foo_lib. Класс определяет методыm1, m2, а также m3.
Foo.dart
library foo_lib;
// libarary name can be a symbol
class Foo {
// class name can be a symbol
m1() {
// method name can be a symbol
print("Inside m1");
}
m2() {
print("Inside m2");
}
m3() {
print("Inside m3");
}
}
Следующий код загружает Foo.dartбиблиотека и ищет класс Foo с помощью типа Symbol. Поскольку мы отражаем метаданные из указанной выше библиотеки, код импортируетdart:mirrors библиотека.
FooSymbol.dart
import 'dart:core';
import 'dart:mirrors';
import 'Foo.dart';
main() {
Symbol lib = new Symbol("foo_lib");
//library name stored as Symbol
Symbol clsToSearch = new Symbol("Foo");
// class name stored as Symbol
if(checkIf_classAvailableInlibrary(lib, clsToSearch))
// searches Foo class in foo_lib library
print("class found..");
}
bool checkIf_classAvailableInlibrary(Symbol libraryName, Symbol className) {
MirrorSystem mirrorSystem = currentMirrorSystem();
LibraryMirror libMirror = mirrorSystem.findLibrary(libraryName);
if (libMirror != null) {
print("Found Library");
print("checkng...class details..");
print("No of classes found is : ${libMirror.declarations.length}");
libMirror.declarations.forEach((s, d) => print(s));
if (libMirror.declarations.containsKey(className)) return true;
return false;
}
}
Обратите внимание, что строка libMirror.declarations.forEach ((s, d) => print (s)); будет перебирать каждое объявление в библиотеке во время выполнения и печатать объявления как типSymbol.
Этот код должен дать следующее output -
Found Library
checkng...class details..
No of classes found is : 1
Symbol("Foo") // class name displayed as symbol
class found.
Пример: отображение количества методов экземпляра класса
Давайте теперь рассмотрим отображение количества экземпляров методов в классе. Предопределенный классClassMirror помогает нам добиться того же.
import 'dart:core';
import 'dart:mirrors';
import 'Foo.dart';
main() {
Symbol lib = new Symbol("foo_lib");
Symbol clsToSearch = new Symbol("Foo");
reflect_InstanceMethods(lib, clsToSearch);
}
void reflect_InstanceMethods(Symbol libraryName, Symbol className) {
MirrorSystem mirrorSystem = currentMirrorSystem();
LibraryMirror libMirror = mirrorSystem.findLibrary(libraryName);
if (libMirror != null) {
print("Found Library");
print("checkng...class details..");
print("No of classes found is : ${libMirror.declarations.length}");
libMirror.declarations.forEach((s, d) => print(s));
if (libMirror.declarations.containsKey(className)) print("found class");
ClassMirror classMirror = libMirror.declarations[className];
print("No of instance methods found is ${classMirror.instanceMembers.length}");
classMirror.instanceMembers.forEach((s, v) => print(s));
}
}
Этот код должен дать следующее output -
Found Library
checkng...class details..
No of classes found is : 1
Symbol("Foo")
found class
No of instance methods found is 8
Symbol("==")
Symbol("hashCode")
Symbol("toString")
Symbol("noSuchMethod")
Symbol("runtimeType")
Symbol("m1")
Symbol("m2")
Symbol("m3")
Преобразовать символ в строку
Вы можете преобразовать имя типа, такого как класс или библиотека, хранящиеся в символе, обратно в строку, используя MirrorSystemкласс. В следующем коде показано, как преобразовать символ в строку.
import 'dart:mirrors';
void main(){
Symbol lib = new Symbol("foo_lib");
String name_of_lib = MirrorSystem.getName(lib);
print(lib);
print(name_of_lib);
}
Должно получиться следующее output -
Symbol("foo_lib")
foo_lib