2012-11-03 3 views

Antwort

3

Hier ist eine einfache Kopie-pasteable Codebeispiel:

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

Ausgang ist:

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 enthält nicht mehr die Eigenschaft 'methods' Es hat jetzt 'instanceMembers' und 'declarations'. Wäre "instanceMembers" gleichbedeutend mit der alten "methods" -Eigenschaft? – ringstaff

1

ist ein einfaches Beispiel:

(Anmerkung: Sie wollen haben eine (sehr) auf dem neuesten Stand Version des SDK für diese, diese in Dart Editor Version gemacht wurde 0.2.1_r14167, Dart SDK-Version 0.2.1.2_r14167 Nov 2, 2012)

Mein aufrichtigster Dank an Gilad vom Google Dart Team für dieses Beispiel!

#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

Reflexion bezüglich Ich habe nur ein paar „Hilfsfunktionen“ geschrieben, um eine Liste der Methodennamen Abrufen (keine Karte) und das Aufrufen der Methode ... alles, was ich sicher sagen kann ist, dass Es funktioniert jetzt. Es gibt wahrscheinlich technische Gründe dafür, dies nicht zu tun - aber in meinem Fall läuft das nicht in einer komplexen Umgebung. Ich denke jedoch, dass sie eine Menge Details überdecken, mit denen sich nicht alle auseinandersetzen wollen.

Hier ist ein funktionierendes Demonstration mit und ohne die Hilfsfunktionen:

#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); 
    }); 
} 
Verwandte Themen