2009-02-09 30 views
7

Tôi đang phát triển một khung mocking động cho Flex/AS3 và đang gặp sự cố với các loại hỗ trợ/riêng tư (ví dụ: các gói được khai báo bên ngoài gói {} trong tệp lớp).Phân lớp một lớp riêng tư (hỗ trợ) trong AVM2

Trong tệp "ABC" của tôi, tôi khai báo cá thể có cờ PROTECTED_NAMESPACE và với tên đa cấp PRIVATE_NS. Tôi cũng đã thử nghiệm cho nó cùng một không gian tên như lớp nó là phân lớp con (ví dụ: PRIVATE_NS ("ContainerClass.as $ 123")).

Không có vấn đề gì tôi làm, tôi luôn nhận được lỗi sau đây sau khi loadBytes:

VerifyError: Error #1014: Class ContainerClass.as$123::PrivateClass could not be found.

tôi đã thử nghiệm với tải bytecode tạo vào ApplicationDomain giống như lớp riêng (tôi sử dụng tên miền con theo mặc định). Tôi thậm chí đã cố gắng đăng ký một bí danh lớp trước khi tải (mặc dù đó là một chút căng).

Tôi có quên mất bất cứ điều gì hoặc đơn giản là hạn chế AVM không?

Xin lưu ý rằng tôi hoàn toàn biết rằng điều này là bất hợp pháp trong ActionScript 3.0, tôi đang tìm kiếm liệu điều này có thực sự có thể có trong AVM hay không.

Chỉnh sửa: Đối với những người quan tâm đến công việc cho đến nay, dự án là asmock và nằm trên sourceforge.

Trả lời

0

Có đi lại để nhìn vào vấn đề này trong Ernest, tôi dứt khoát có thể trả lời câu hỏi này: lớp tin chỉ có thể được tham chiếu từ LoaderContext mà nạp họ

tôi đã có thể để hỗ trợ thêm cho tin giao diện bằng cách tái tạo giao diện trong tệp ABC được tải, nhưng không thể ép buộc/truyền lại giao diện riêng tư ban đầu.

Điều này vẫn hữu ích cho các yêu cầu của tôi, vì giao diện riêng có thể được sử dụng để kết hợp nhiều giao diện.

1

Tôi không có chuyên gia về tệp ABC nhưng tôi không nghĩ rằng điều này có thể xảy ra trong AVM2. Tôi đã làm một số xét nghiệm một thời gian trước đây với AS3 Eval lib và tất cả đều thất bại.

liên quan đến chế nhạo năng động, tôi đã nộp một vấn đề trong Adobe bugbase, yêu cầu cho một cơ chế proxy năng động: http://bugs.adobe.com/jira/browse/ASC-3136

+0

Tôi thực sự đã phát triển một khuôn khổ proxy động và nó hoạt động tốt (với các lớp/giao diện gói). Tính năng nổi bật duy nhất của khung công tác là chế nhạo các lớp 'riêng tư' (được khai báo bên ngoài gói). –

+0

Wow, sau đó tôi thực sự phải kiểm tra điều đó! Tôi giả sử bạn không làm điều này với các khả năng tiêu chuẩn AS3? –

+0

Thực ra, tôi chỉ sử dụng Loader.loadBytes().Tạo một SWF/ABC động khi chạy là phần phức tạp;) –

1

Tôi không chắc chắn những gì bạn có ý nghĩa bởi PRIVATE_NS ("ContainerClass.as $ 123"), Mỹ đọc của avm2overview.pdf 4.4.1 là không gian tên riêng không được phép có tên, do đó "< tên lớp> $ < number>" không gian tên trong đầu ra gỡ lỗi được tạo ra để thuận tiện cho bạn. Tôi sẽ cho rằng điều đó có nghĩa là bạn sẽ phải hack abc của bạn vào cùng một thẻ abc trong swf nguồn để truy cập vào chỉ mục hằng số không gian tên (và âm thanh đó quá khó với tôi!)

Tôi chưa thực sự quản lý để tạo ra một swf tải, mặc dù, do đó, lấy điều này với một hạt muối.

+0

4.4.1 chỉ định rằng không gian tên SYSTEM là trống (ví dụ: String, int, v.v.), nhưng không gian tên riêng (ví dụ: không có tên PrivateNs/0x5) vẫn có các giá trị. .as $ được tự động cấp dưới dạng tên riêng (riêng) cho các lớp lồng nhau. –

+0

Ngoài ra, khuôn khổ mà tôi đang làm việc tạo ra một swf tải và hỗ trợ thế hệ của tất cả các loại lớp (bao gồm cả Vector. ). Chỉ có các lớp "lồng nhau" đang khiến tôi đau buồn. Nếu bạn quan tâm đến công việc cho đến nay, nguồn có sẵn tại http://asmock.sourceforge.net –

+0

"Các không gian tên do người dùng định nghĩa có CONSTANT_Namespace loại hoặc CONSTANT_ExplicitNamespace và một tên không trống. Các không gian tên hệ thống có tên trống và một của các loại khác "là văn bản tôi đang nghĩ đến ở đây. Điều này ngụ ý CONSTANT_PrivateNs là một hệ thống NS, và không có tên được lưu trữ. –

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