2013-01-09 44 views

Trả lời

3

Bạn cần phải biết tên thư viện và lớp tên để làm cho mọi thứ hoạt động bình thường. Giả sử bạn biết cả hai, ví dụ dưới đây sẽ khởi tạo TestClass và gọi doStuff trên đó.

library test; 

import "dart:mirrors"; 

class TestClass { 
    doStuff() => print("doStuff was called!"); 
} 

main() { 
    MirrorSystem mirrors = currentMirrorSystem(); 
    LibraryMirror lm = mirrors.libraries['test']; 
    ClassMirror cm = lm.classes['TestClass']; 
    Future tcFuture = cm.newInstance('', []); 
    tcFuture.then((InstanceMirror im) { 
    var tc = im.reflectee; 
    tc.doStuff(); 
    }); 
} 

Một vài lưu ý về giải pháp này:

  1. Thư viện test chúng tôi đang cố gắng để tải các lớp từ đã được nhập khẩu trong VM, mà làm cho trường hợp này một chút dễ dàng hơn.
  2. cuộc gọi newInstance cho phép truyền tham số cho hàm tạo. Các đối số vị trí được thực hiện, nhưng các tham số được đặt tên chưa được triển khai (kể từ bản phát hành M2).
  3. newInstance trả về một Future để cho phép nó hoạt động trên isolates.
+0

'newInstance' không trả lại' Tương lai' vì việc khởi tạo lớp có thể yêu cầu thao tác không đồng bộ, điều đó không đúng, mọi thứ đã được tải. Nó trả về một 'Future' vì Mirrors API cố ý không đồng bộ, vì nó sẽ làm việc trên các isolates trong tương lai (và liên lạc chéo cô lập luôn không đồng bộ). Nếu bạn cẩn thận kiểm tra lời gọi 'newInstance' (và các lệnh khác như' get/setField' hoặc 'invoke' quá), bạn sẽ thấy rằng dưới mui xe, nó hoạt động đồng bộ. Điều đó rõ ràng có thể thay đổi trong tương lai. – Ladicek

+0

Cảm ơn Ladicek. Tôi đã cập nhật câu trả lời. – Kyrra

+0

Lưu ý: điều này có thể không hoạt động khi được biên dịch sang JavaScript. Trình biên dịch dart2js chưa hỗ trợ đầy đủ các gương. –

4

Cú pháp đã thay đổi. Tôi đã làm việc theo cách này

library test; 

import "dart:mirrors"; 

class TestClass { 
    doStuff() => print("doStuff was called!"); 
} 

main() { 
    MirrorSystem mirrors = currentMirrorSystem(); 
    LibraryMirror lm = mirrors.libraries.values.firstWhere(
     (LibraryMirror lm) => lm.qualifiedName == new Symbol('test')); 

    ClassMirror cm = lm.declarations[new Symbol('TestClass')]; 

    InstanceMirror im = cm.newInstance(new Symbol(''), []); 
    var tc = im.reflectee; 
    tc.doStuff(); 
} 

Nếu có nhiều thư viện hơn có tên 'thử nghiệm' thì điều này sẽ thất bại.

+0

Thật vậy, 'lớp' getter đã được thay đổi thành' khai báo'. – snitko

Các vấn đề liên quan