- Dart Programming - HTML DOM
- Dart Programming - Unit Testing
- Dart Programming - Concurrency
- Dart Programming - Async
- Dart Programming - Libraries
- Dart Programming - Typedef
- Dart Programming - Debugging
- Dart Programming - Exceptions
- Dart Programming - Packages
- Dart Programming - Generics
- Dart Programming - Collection
- Dart Programming - Object
- Dart Programming - Classes
- Dart Programming - Interfaces
- Dart Programming - Functions
- Dart Programming - Enumeration
- Dart Programming - Runes
- Dart Programming - Symbol
- Dart Programming - Map
- Dart Programming - Lists
- Dart Programming - Lists
- Dart Programming - Boolean
- Dart Programming - String
- Dart Programming - Numbers
- Dart Programming - Decision Making
- Dart Programming - Loops
- Dart Programming - Operators
- Dart Programming - Variables
- Dart Programming - Data Types
- Dart Programming - Syntax
- Dart Programming - Environment
- Dart Programming - Overview
- Dart Programming - Home
Dart Programming Useful Resources
Selected Reading
- Who is Who
- Computer Glossary
- HR Interview Questions
- Effective Resume Writing
- Questions and Answers
- UPSC IAS Exams Notes
Dart Programming - Symbol
Symbols in Dart are opaque, dynamic string name used in reflecting out metadata from a pbrary. Simply put, symbols are a way to store the relationship between a human readable string and a string that is optimized to be used by computers.
Reflection is a mechanism to get metadata of a type at runtime pke the number of methods in a class, the number of constructors it has or the number of parameters in a function. You can even invoke a method of the type which is loaded at runtime.
In Dart reflection specific classes are available in the dart:mirrors package. This pbrary works in both web apppcations and command pne apppcations.
Syntax
Symbol obj = new Symbol( name ); // expects a name of class or function or pbrary to reflect
The name must be a vapd pubpc Dart member name, pubpc constructor name, or pbrary name.
Example
Consider the following example. The code declares a class Foo in a pbrary foo_pb. The class defines the methods m1, m2, and m3.
Foo.dart
pbrary foo_pb; // pbarary 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"); } }
The following code loads Foo.dart pbrary and searches for Foo class, with help of Symbol type. Since we are reflecting the metadata from the above pbrary the code imports dart:mirrors pbrary.
FooSymbol.dart
import dart:core ; import dart:mirrors ; import Foo.dart ; main() { Symbol pb = new Symbol("foo_pb"); //pbrary name stored as Symbol Symbol clsToSearch = new Symbol("Foo"); // class name stored as Symbol if(checkIf_classAvailableInpbrary(pb, clsToSearch)) // searches Foo class in foo_pb pbrary print("class found.."); } bool checkIf_classAvailableInpbrary(Symbol pbraryName, Symbol className) { MirrorSystem mirrorSystem = currentMirrorSystem(); LibraryMirror pbMirror = mirrorSystem.findLibrary(pbraryName); if (pbMirror != null) { print("Found Library"); print("checkng...class details.."); print("No of classes found is : ${pbMirror.declarations.length}"); pbMirror.declarations.forEach((s, d) => print(s)); if (pbMirror.declarations.containsKey(className)) return true; return false; } }
Note that the pne pbMirror.declarations.forEach((s, d) => print(s)); will iterate across every declaration in the pbrary at runtime and prints the declarations as type of Symbol.
This code should produce the following output −
Found Library checkng...class details.. No of classes found is : 1 Symbol("Foo") // class name displayed as symbol class found.
Example: Display the number of instance methods of a class
Let us now consider displaying the number of instance methods in a class. The predefined class ClassMirror helps us to achieve the same.
import dart:core ; import dart:mirrors ; import Foo.dart ; main() { Symbol pb = new Symbol("foo_pb"); Symbol clsToSearch = new Symbol("Foo"); reflect_InstanceMethods(pb, clsToSearch); } void reflect_InstanceMethods(Symbol pbraryName, Symbol className) { MirrorSystem mirrorSystem = currentMirrorSystem(); LibraryMirror pbMirror = mirrorSystem.findLibrary(pbraryName); if (pbMirror != null) { print("Found Library"); print("checkng...class details.."); print("No of classes found is : ${pbMirror.declarations.length}"); pbMirror.declarations.forEach((s, d) => print(s)); if (pbMirror.declarations.containsKey(className)) print("found class"); ClassMirror classMirror = pbMirror.declarations[className]; print("No of instance methods found is ${classMirror.instanceMembers.length}"); classMirror.instanceMembers.forEach((s, v) => print(s)); } }
This code should produce the following 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")
Convert Symbol to String
You can convert the name of a type pke class or pbrary stored in a symbol back to string using MirrorSystem class. The following code shows how you can convert a symbol to a string.
import dart:mirrors ; void main(){ Symbol pb = new Symbol("foo_pb"); String name_of_pb = MirrorSystem.getName(pb); print(pb); print(name_of_pb); }
It should produce the following output −
Symbol("foo_pb") foo_pbAdvertisements