Lập trình phi tiêu - Biểu tượng

Các ký hiệu trong Dart là tên chuỗi động, không rõ ràng được sử dụng để phản ánh siêu dữ liệu từ thư viện. Nói một cách đơn giản, các ký hiệu là một cách để lưu trữ mối quan hệ giữa một chuỗi có thể đọc được của con người và một chuỗi được tối ưu hóa để sử dụng bởi máy tính.

Reflection là một cơ chế để lấy siêu dữ liệu của một loại trong thời gian chạy như số phương thức trong một lớp, số lượng hàm tạo nó có hoặc số lượng tham số trong một hàm. Bạn thậm chí có thể gọi một phương thức của kiểu được tải trong thời gian chạy.

Các lớp cụ thể về phản xạ In Dart có sẵn trong dart:mirrorsgói hàng. Thư viện này hoạt động trong cả ứng dụng web và ứng dụng dòng lệnh.

Cú pháp

Symbol obj = new Symbol('name');  
// expects a name of class or function or library to reflect

Các name phải là tên thành viên Dart công khai hợp lệ, tên phương thức khởi tạo công khai hoặc tên thư viện.

Thí dụ

Hãy xem xét ví dụ sau. Mã khai báo một lớpFoo ở trong thư viện foo_lib. Lớp định nghĩa các phương thứcm1, m2,m3.

Nghệ thuật ẩm thực

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"); 
   } 
}

Mã sau tải Foo.dartthư viện và tìm kiếm lớp Foo, với sự trợ giúp của loại Biểu tượng. Vì chúng tôi đang phản ánh siêu dữ liệu từ thư viện trên nên mã sẽ nhậpdart:mirrors thư viện.

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; 
   } 
}

Lưu ý rằng dòng libMirror.decl Tuyên bố.forEach ((s, d) => print (s)); sẽ lặp qua mọi khai báo trong thư viện trong thời gian chạy và in các khai báo dưới dạngSymbol.

Mã này sẽ tạo ra những điều sau output -

Found Library 
checkng...class details.. 
No of classes found is : 1 
Symbol("Foo") // class name displayed as symbol  
class found.

Ví dụ: Hiển thị số lượng các phương thức thể hiện của một lớp

Bây giờ chúng ta hãy xem xét việc hiển thị số lượng các phương thức thể hiện trong một lớp. Lớp được xác định trướcClassMirror giúp chúng tôi đạt được điều tương tự.

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)); 
   } 
}

Mã này sẽ tạo ra những điều sau 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")

Chuyển đổi biểu tượng thành chuỗi

Bạn có thể chuyển đổi tên của một loại như lớp hoặc thư viện được lưu trữ trong một biểu tượng trở lại chuỗi bằng cách sử dụng MirrorSystemlớp học. Đoạn mã sau đây cho thấy cách bạn có thể chuyển đổi một biểu tượng thành một chuỗi.

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

Nó sẽ tạo ra những thứ sau output -

Symbol("foo_lib")   

foo_lib