2014-06-27 2 views
1

J'ai cette annotationObtenir les instances de ClassMirror pour toutes les classes qui ont une annotation

class Target{ 
    final String value; 
    const Target(this.value); 
} 

et 2 classes qui sont annotés avec elle

@Target("/313") 
class c1{ 

} 

@Target("/314") 
class c2{ 

} 

Comment puis-je obtenir une liste des ClassMirror instances pour les classes qui ont l'annotation Target?

basé sur la réponse choisie qui est si je savais ce que bibliothèque mes calsses existent dans

var mirrorSystem = currentMirrorSystem(); 
    var libraryMirror = mirrorSystem.findLibrary(#testlib); 
    for(ClassMirror classMirror in libraryMirror.declarations.values){ 
    if(classMirror.metadata!=null){ 
     for(var meta in classMirror.metadata){ 
      if(meta.type == reflectClass(Path)){ 
       print(classMirror.simpleName); 
       print(meta.getField(#value)); 
      } 
      } 
    } 
    } 
+2

http://stackoverflow.com/questions/24111378/refer-classes-by-their-metadata-tag – JAre

+1

@JAre Merci d'avoir ajouté le lien. Je savais que j'ai vu une question similaire récemment mais je n'ai pas réussi à la trouver. –

Répondre

4

Ceci recherche toutes les bibliothèques de l'isolat en cours pour les classes qui sont annotés avec @Target('/313')

@MirrorsUsed(metaTargets: Target) // might be necessary when you build this code to JavaScript 
import 'dart:mirrors'; 

class Target { 
    final String id; 
    const Target(this.id); 
} 

@Target('/313') 
class c1{ 

} 

@Target('/314') 
class c2{ 

} 

@Target('/313') 
@Target('/314') 
class c3{ 

} 

void main() { 
    MirrorSystem mirrorSystem = currentMirrorSystem(); 
    mirrorSystem.libraries.forEach((lk, l) { 
    l.declarations.forEach((dk, d) { 
     if(d is ClassMirror) { 
     ClassMirror cm = d as ClassMirror; 
     cm.metadata.forEach((md) { 
      InstanceMirror metadata = md as InstanceMirror; 
      if(metadata.type == reflectClass(Target) && metadata.getField(#id).reflectee == '/313') { 
      print('found: ${cm.simpleName}'); 
      } 
     }); 
     } 
    }); 
    }); 
} 

trouvé: Symbole ("c3")
trouvé: Symbole ("c1")

+0

Je pense que vous pouvez l'optimiser avec le 'MirrorsUsed (metaTargets: Target)' – JAre

+0

@Je n'ai pas besoin puisque le code est destiné à fonctionner sur le serveur – FPGA

+0

@FPGA il pourrait accélérer les choses ou pourrait ne rien faire. No harm :) – JAre

Questions connexes