Menggunakan Symbol Dengan Dart

Menggunakan Symbol Dengan Dart

Symbol dalam bahasa pemrograman Dart adalah String dinamis yang digunakan untuk mencerminkan metadata dari suatu library. Secara sederhana, Symbol merupakan cara untuk menyimpan hubungan antara String yang dapat dibaca manusia dan String yang dioptimalkan untuk digunakan oleh komputer.

Reflection adalah mekanisme untuk mendapatkan metadata suatu tipe pada saat runtime seperti jumlah method atau fungsi dalam suatu class, jumlah constructor yang dimilikinya, atau jumlah parameter dalam suatu fungsi. Bahkan, Anda dapat memanggil fungsi tertentu pada saat runtime.

Terdapat class khusus yang tersedia dalam library dart:mirrors untuk menggunakan fungsi-fungsi Reflection dengan menggunakan Dart.

Cara Penulisan

Symbol obj = Symbol('nama');  
// Di sini kita bisa melakukan reflection untuk Class, method, atau library tertentu

Variable nama harus berupa variable public yang valid seperti nama public constructor atau nama library.

Penggunaan Symbol

Perhatikan contoh berikut. Kode ini mendeklarasikan sebuah class Foo dalam sebuah library foo_lib. Class ini mendefinisikan fungsi-fungsi m1, m2, dan m3.

Foo.dart

library foo_lib;   
// Nama library bisa dipakai menjadi sebuah Symbol   

class Foo {         
   // Nama class bisa dipakai menjadi symbol  
   m1() {        
      // nama method/fungsi bisa dipakai menjadi symbol
      print("Inside m1"); 
   } 
   m2() { 
      print("Inside m2"); 
   } 
   m3() { 
      print("Inside m3"); 
   } 
}

Kode di bawah ini memuat library Foo.dart dan mencari class Foo, dengan bantuan Symbol. Karena kita merefleksikan metadata dari library di atas, maka kode ini mengimpor library dart:mirrors.

FooSymbol.dart

import 'dart:core';
import 'dart:mirrors';
import 'Foo.dart';

main() {
  Symbol lib = new Symbol("foo_lib");
  // Nama library dipakai sebagai Symbol

  Symbol clsToSearch = new Symbol("Foo");
  // Nama class dipakai sebagai Symbol

  if(checkApakah_classTersediaDidalamLibrary(lib, clsToSearch))
    // mencari class Foo di library foo_lib
    print("Class ditemukan ...");
}

bool checkApakah_classTersediaDidalamLibrary(Symbol libraryName, Symbol className) {
  MirrorSystem mirrorSystem = currentMirrorSystem();
  LibraryMirror libMirror = mirrorSystem.findLibrary(libraryName);

  if (libMirror != null) {
    print("Library ditemukan");
    print("Melakukan pengecekkan ... detail class ...");
    print("Class yang ditemukan : ${libMirror.declarations.length}");
    libMirror.declarations.forEach((s, d) => print(s));

    if (libMirror.declarations.containsKey(className)) return true;
       return false;
  }
  print('libMirror = null');
  return false;
}

Perhatikan bahwa baris libMirror.declarations.forEach((s, d) => print(s));  akan mengulang setiap deklarasi dalam library pada saat runtime dan mencetak deklarasi sebagai tipe Symbol.

Kode ini seharusnya menghasilkan output berikut:

Library ditemukan
Melakukan pengecekkan... detail class ...
Class yang ditemukan : 1
Symbol("Foo")
Class ditemukan ...

Contoh

Contoh di bawah ini bertujuan untuk menampilkan jumlah instance method dalam sebuah class. Class bawaan ClassMirror membantu kita untuk mencapai tujuan tersebut.

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("Library ditemukan");
    print("Melakukan pengecekan ... detail class ...");
    print("Class yang ditemukan : ${libMirror.declarations.length}");
    libMirror.declarations.forEach((s, d) => print(s));
    if (libMirror.declarations.containsKey(className)) print("kelas ditemukan");
    ClassMirror? classMirror =
        libMirror.declarations[className] as ClassMirror?;
    print(
        "Jumlah instance method yang ditemukan adalah ${classMirror!.instanceMembers.length}");
    classMirror.instanceMembers.forEach((s, v) => print(s));
  }
}

Kode di atas akan mengeluarkan output seperti berikut :

Library ditemukan
Melakukan pengecekan ... detail class ...
Class yang ditemukan : 1
Symbol("Foo")
Class ditemukan ...
Jumlah instance method yang ditemukan adalah 8
Symbol("==")
Symbol("hashCode")
Symbol("toString")
Symbol("noSuchMethod")
Symbol("runtimeType")
Symbol("m1")
Symbol("m2")
Symbol("m3")

Konversi Symbol ke String

Anda dapat melakukan konversi nama tipe seperti class atau library yang disimpan dalam Symbol kembali ke String menggunakan kelas MirrorSystem. Kode berikut menunjukkan bagaimana Anda dapat melakukan konversi Symbol menjadi String.

import 'dart:mirrors'; 
void main(){ 
   Symbol lib = new Symbol("foo_lib"); 
   String namaLibrary = MirrorSystem.getName(lib); 
   
   print(lib); 
   print(namaLibrary); 
}

Kode di atas seharusnya menghasilkan output berikut :

Symbol("foo_lib")
foo_lib

Tutorial sebelumnya : Map Dart
Tutorial setelahnya : Menggunakan Rune Dengan Dart
Semua Tutorial Dart : Tutorial Dart

Tinggalkan Balasan

Keranjang Belanja0
Keranjang belanja kosong ...
0