我正在为Flex / AS3开发一个动态模拟框架,并且在使用私有/支持类型时遇到问题(即在类文件中在包{}之外声明的那些)。
在我的ABC“文件”中,我使用PROTECTED_NAMESPACE类标志和PRIVATE_NS多个名称声明实例。我也试过给它与子类化的类相同的命名空间(例如.ENFEN_NS(“ContainerClass.as $ 123”))。
无论我做什么,我总是在loadBytes之后得到以下错误:
VerifyError:错误#1014:类ContainerClass.as $ 123 ::找不到PrivateClass。
我已尝试将生成的字节码加载到与私有类相同的ApplicationDomain中(默认情况下我使用子域)。我甚至尝试在加载之前注册一个类别名(虽然这有点拉伸)。
我忘了什么,或者只是对AVM的限制?
请注意,我完全清楚这在ActionScript 3.0中是非法的,我正在寻找这是否在AVM中实际可行。
编辑:对于那些对目前工作感兴趣的人,该项目是asmock,并且是在sourceforge上。
答案 0 :(得分:1)
我不是ABC文件的专家,但我认为这在AVM2中是不可能的。我不久前用AS3 Eval lib进行了几次测试,但都失败了。
与动态模拟有关,我在Adobe bugbase中提出了一个问题,要求提供动态代理机制:http://bugs.adobe.com/jira/browse/ASC-3136
答案 1 :(得分:1)
我不确定你的意思是PRIVATE_NS(“ContainerClass.as $ 123”),我对avm2overview.pdf 4.4.1的解读是私有命名空间不允许有名字,因此“< class名称> $<数>”中为方便起见,生成调试输出中的命名空间。我认为这意味着你必须将你的abc破解到源swf中的同一个abc标签中才能访问命名空间常量索引(这听起来对我来说太辛苦了!)
尽管如此,我还没有设法生成加载swf,所以请带上一粒盐。
答案 2 :(得分:0)
回过头来看看欧内斯特的这个问题,我可以明确地回答这个问题:私有类只能从加载它们的LoaderContext中引用
我已经能够通过在加载的ABC'文件'中重现接口来添加对私有接口的支持,但是它不能被强制/强制转换回原始私有接口。
这对我的要求仍然有用,因为私有接口可用于组合多个接口。