Pemrograman Dart - Simbol
Simbol di Dart tidak tembus cahaya, nama string dinamis yang digunakan untuk mencerminkan metadata dari pustaka. Sederhananya, simbol adalah cara untuk menyimpan hubungan antara string yang dapat dibaca manusia dan string yang dioptimalkan untuk digunakan oleh komputer.
Refleksi adalah mekanisme untuk mendapatkan metadata dari suatu tipe pada waktu proses seperti jumlah metode dalam suatu kelas, jumlah konstruktor yang dimilikinya, atau jumlah parameter dalam suatu fungsi. Anda bahkan dapat menjalankan metode jenis yang dimuat saat runtime.
Dalam kelas khusus refleksi Dart tersedia di dart:mirrorspaket. Pustaka ini berfungsi di aplikasi web dan aplikasi baris perintah.
Sintaksis
Symbol obj = new Symbol('name');
// expects a name of class or function or library to reflect
Itu name harus berupa nama anggota Dart publik yang valid, nama konstruktor publik, atau nama perpustakaan.
Contoh
Perhatikan contoh berikut. Kode mendeklarasikan sebuah kelasFoo di dalam perpustakaan foo_lib. Kelas mendefinisikan metodem1, m2, dan 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");
}
}
Kode berikut dimuat Foo.dartperpustakaan dan mencari kelas Foo, dengan bantuan tipe Simbol. Karena kita merefleksikan metadata dari pustaka di atas, kodenya diimpordart:mirrors Perpustakaan.
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;
}
}
Perhatikan bahwa baris libMirror.declarations.forEach ((s, d) => print (s)); akan mengulangi setiap deklarasi di perpustakaan saat runtime dan mencetak deklarasi tersebut sebagai tipeSymbol.
Kode ini harus menghasilkan yang berikut output -
Found Library
checkng...class details..
No of classes found is : 1
Symbol("Foo") // class name displayed as symbol
class found.
Contoh: Menampilkan jumlah metode instance sebuah kelas
Sekarang mari kita pertimbangkan untuk menampilkan jumlah metode instance di kelas. Kelas yang telah ditentukan sebelumnyaClassMirror membantu kami mencapai hal yang sama.
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));
}
}
Kode ini harus menghasilkan yang berikut 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")
Ubah Simbol menjadi String
Anda dapat mengonversi nama jenis seperti kelas atau perpustakaan yang disimpan dalam simbol kembali ke string menggunakan MirrorSystemkelas. Kode berikut menunjukkan bagaimana Anda dapat mengubah simbol menjadi string.
import 'dart:mirrors';
void main(){
Symbol lib = new Symbol("foo_lib");
String name_of_lib = MirrorSystem.getName(lib);
print(lib);
print(name_of_lib);
}
Ini harus menghasilkan yang berikut output -
Symbol("foo_lib")
foo_lib