7

我正在为 Flex/AS3 开发一个动态模拟框架,并且在私有/支持类型(即在类文件中的包 {} 之外声明的类型)遇到问题。

在我的 ABC“文件”中,我使用 PROTECTED_NAMESPACE 类标志和 PRIVATE_NS 多名称声明实例。我还尝试赋予它与它所继承的类相同的命名空间(例如 PRIVATE_NS("ContainerClass.as$123"))。

不管我做什么,在loadBytes之后我总是得到以下错误:

VerifyError:错误 #1014:找不到类 ContainerClass.as$123::PrivateClass。

我已经尝试将生成的字节码加载到与私有类相同的 ApplicationDomain 中(默认情况下我使用子域)。我什至尝试在加载之前注册一个类别名(尽管这有点牵强)。

我忘记了什么还是仅仅是 AVM 的限制?

请注意,我完全知道这在 ActionScript 3.0 中是非法的,我正在寻找这在 AVM 中是否真的可行。

编辑:对于迄今为止对这项工作感兴趣的人,该项目是asmock并且在 sourceforge 上。

4

3 回答 3

1

我不是 ABC 文件的专家,但我认为这在 AVM2 中是不可能的。不久前我用AS3 Eval lib做了几次测试,但都失败了。

与动态模拟相关,我在 Adob​​e bugbase 中提交了一个问题,要求提供动态代理机制:http ://bugs.adobe.com/jira/browse/ASC-3136

于 2009-02-09T15:01:13.747 回答
1

我不确定 PRIVATE_NS("ContainerClass.as$123") 是什么意思,我对 avm2overview.pdf 4.4.1 的解读是私有命名空间不允许有名称,因此“<class name>$<为方便起见,会在调试输出中生成 number>" 命名空间。我认为这意味着您必须将您的 abc 破解到源 swf 中的相同 abc 标记中才能访问命名空间常量索引(这对我来说听起来太辛苦了!)

不过,我实际上并没有设法生成加载 swf,因此请谨慎对待。

于 2009-03-09T07:18:52.340 回答
0

回过头来看这个问题,我可以肯定地回答这个问题:私有类只能从加载它们的 LoaderContext 中引用

我已经能够通过在加载的 ABC '文件'中复制接口来添加对私有接口的支持,但它不能被强制/强制转换回原始私有接口。

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

于 2010-10-22T16:26:20.960 回答