2012-11-03 14 views

Trả lời

3

Dưới đây là một mẫu dễ dàng sao chép pasteable mã:

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

Output là:

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 không còn chứa thuộc tính 'phương thức' nữa. Nó bây giờ có 'instanceMembers' và 'declarationations'. 'InstanceMembers' có đồng nghĩa với thuộc tính 'phương thức' cũ không? – ringstaff

1

Dưới đây là một ví dụ cơ bản:

(Lưu ý: Bạn sẽ muốn có một (rất) lên đến phiên bản cập nhật của SDK cho điều này, điều này đã được thực hiện trong Dart Editor phiên bản 0.2.1_r14167, Dart SDK phiên bản 0.2.1.2_r14167 Ngày 2 tháng 11 năm 2012)

Chân thành nhất của tôi Cảm ơn Gilad của Nhóm Google Dart đã cung cấp ví dụ này!

#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

Về Reflection Tôi vừa viết một vài "Chức năng trợ giúp" cho việc lấy một danh sách các tên phương pháp (không phải là một bản đồ) và cách gọi phương thức ... tất cả tôi có thể nói chắc chắn là nó hoạt động ngay bây giờ. Có nhiều lý do kỹ thuật để không làm theo cách này - nhưng trong trường hợp của tôi, điều này không chạy trong một môi trường phức tạp. Tuy nhiên, tôi nghĩ họ độc đáo che giấu rất nhiều chi tiết mà không phải ai cũng muốn giải quyết.

Dưới đây là một cuộc biểu tình chức năng có và không có chức năng Helper:

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