在AVM2中对私有(支持)类进行子类化

时间:2009-02-09 14:31:14

标签: flex avm2

我正在为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上。

3 个答案:

答案 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'文件'中重现接口来添加对私有接口的支持,但是它不能被强制/强制转换回原始私有接口。

这对我的要求仍然有用,因为私有接口可用于组合多个接口。