Trong phi tiêu, có thể khởi tạo một lớp từ một chuỗi không?Khởi tạo một lớp học từ một chuỗi
Ví dụ:
- vani trong javascript:
var myObject = window[classNameString];
- Objective-C:
id myclass = [[NSClassFromString(@"MyClass") alloc] init];
Trong phi tiêu, có thể khởi tạo một lớp từ một chuỗi không?Khởi tạo một lớp học từ một chuỗi
Ví dụ:
var myObject = window[classNameString];
id myclass = [[NSClassFromString(@"MyClass") alloc] init];
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:
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.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).newInstance
trả về một Future để cho phép nó hoạt động trên isolates.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.
Thật vậy, 'lớp' getter đã được thay đổi thành' khai báo'. – snitko
'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
Cảm ơn Ladicek. Tôi đã cập nhật câu trả lời. – Kyrra
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. –