2012-11-03 15 views

risposta

3

Ecco un semplice copia-pasteable esempio di codice:

import 'dart:mirrors'; 
import 'dart:io'; 

main() { 
    var im = reflect(new File('test')); // Retrieve the InstanceMirror of some class instance. 
    im.type.methods.values.forEach((MethodMirror method) => print(method.simpleName)); 
} 

uscita è:

existsSync 
_delete 
exists 
directory 
_getDecodedLines 
readAsTextSync 
readAsBytesSync 
readAsLinesSync 
_directory 
throwIfError 
lastModifiedSync 
readAsLines 
open 
_ensureFileService 
deleteSync 
delete 
_exists 
length 
openInputStream 
create 
_create 
readAsText 
_openStdioSync 
openOutputStream 
_fullPath 
_lastModified 
fullPathSync 
readAsBytes 
lastModified 
_openStdio 
_open 
openSync 
lengthSync 
directorySync 
fullPath 
createSync 
_lengthFromName 
+1

ClassMirror non contiene più la proprietà 'methods'. Ora ha 'instanceMembers' e 'dichiarazioni'. "InstanceMembers" sarebbe sinonimo della vecchia proprietà "methods"? – ringstaff

1

Ecco un esempio di base:

(Nota: Si vuole avere una (molto) fino alla versione data del SDK per questo, questo è stato fatto a Dart Editor versione 0.2.1_r14167, Dart SDK versione 0.2.1.2_r14167 2 nov 2012)

Il mio più sincero Grazie a Gilad del Google Dart Team per aver fornito questo esempio!

#import('dart:mirrors'); 

class MyClass { 
    String _test; 

    String get test  => _test; 
    set  test(String paramVal) => _test = paramVal; 

    void my_method() { 
    } 

    void print_test(){ 
    print("test string is: ${_test}"); 
    } 

    MyClass(String test) { 
    _test = test; 
    } 

} 


main() { 

    MyClass myClass = new MyClass("Make my day, PUNK."); 

    myClass.print_test(); 

    //ClassMirror myClassMirror = reflect(myClass).type; 

    InstanceMirror myClassInstanceMirror = reflect(myClass); 

    ClassMirror MyClassMirror = myClassInstanceMirror.type; 

    Map<String, MethodMirror> map = MyClassMirror.methods; 

    print("map = ${map}"); 

    map.values.forEach((MethodMirror mm){ 
    myClassInstanceMirror.invoke(mm.simpleName,[]); 
    }); 

} 
0

Per quanto riguarda la riflessione che ho appena scritto un paio di "Funzioni di supporto" per il recupero di un elenco dei nomi dei metodi (non una mappa) e invocando il metodo ... tutto quello che posso dire per certo è che funziona proprio ora Ci sono probabilmente motivi tecnici per non farlo in questo modo - ma nel mio caso questo non funziona in un ambiente complesso. Tuttavia, penso che mascherino bene molti dettagli che non tutti vorranno affrontare.

Ecco una dimostrazione di funzionamento con e senza le funzioni di supporto:

#import('dart:mirrors'); 

class MyClass { 
    String _test; 
    String get test    => _test; 
    set  test(String paramVal) => _test = paramVal; 
    void my_method1(){print("in method1");} 
    void my_method2(){print("in method2");} 
    void print_test(){ 
    print("test string is: ${_test}"); 
    } 
    MyClass(String test) { 
    _test = test; 
    } 
} 

//Helper Methods 
InstanceMirror hMr; 
List REFLECT_methods(Object myClass) {hMr=reflect(myClass);return(hMr.type.methods.values);} 
REFLECT_invoke(MethodMirror mm){hMr.invoke(mm.simpleName, []);} 

main() { 

    MyClass myClass = new MyClass("Make my day, PUNK."); 

    print("\n=======Using Raw Reflection================"); 
    InstanceMirror myClassInstanceMirror = reflect(myClass); 
    ClassMirror MyClassMirror = myClassInstanceMirror.type; 
    Map<String, MethodMirror> map1 = MyClassMirror.methods; 
    map1.values.forEach((MethodMirror mm){ 
    myClassInstanceMirror.invoke(mm.simpleName,[]); 
    }); 

    print("\n==========Using Helper functions============="); 
    List list2 = REFLECT_methods(myClass); 
    list2.forEach((method){ 
    REFLECT_invoke(method); 
    }); 
} 
Problemi correlati