2009-02-09 10 views
7

Estoy desarrollando un marco de burla dinámico para Flex/AS3 y tengo problemas con los tipos privados/de soporte (es decir, aquellos declarados fuera del paquete {} en un archivo de clase).Subclasificación de una clase privada (soporte) en AVM2

En mi "archivo" ABC, declaro la instancia con el distintivo de clase PROTECTED_NAMESPACE y con una multinacional PRIVATE_NS. También he experimentado con darle el mismo espacio de nombres que la clase que está subclasificando (por ejemplo, PRIVATE_NS ("ContainerClass.as $ 123")).

No importa lo que haga, siempre me sale el siguiente error después de loadBytes:

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

he experimentado con cargar el código de bytes generada en el mismo ApplicationDomain como la clase privada (yo uso un dominio secundario por defecto) Incluso traté de registrar un alias de clase antes de la carga (aunque eso fue un poco exagerado).

¿Estoy olvidando algo o es simplemente una restricción de la AVM?

Tenga en cuenta que soy totalmente consciente de que esto es ilegal en ActionScript 3.0, estoy buscando si esto es realmente posible en el AVM.

Editar: Para aquellos interesados ​​en el trabajo hasta el momento, el proyecto es asmock y está en SourceForge.

Respuesta

0

Después de haber vuelto a mirar a este problema en Ernest, puedo responder definitivamente a esta pregunta: clases privadas sólo pueden ser referenciados desde el LoaderContext que los cargaron

he sido capaz de añadir soporte para privado interfaces reproduciendo la interfaz en el 'archivo' ABC cargado, pero no se puede forzar/devolver a la interfaz privada original.

Esto sigue siendo útil para mis requisitos, ya que una interfaz privada se puede usar para combinar múltiples interfaces.

1

No soy un experto con archivos ABC pero simplemente no creo que esto sea posible en el AVM2. Hice varias pruebas hace un tiempo con el AS3 Eval lib y todas fallaron.

Relacionado con burla dinámico, he presentado un problema en Adobe Bugbase, pidiendo un mecanismo de proxy dinámico: http://bugs.adobe.com/jira/browse/ASC-3136

+0

En realidad, he desarrollado un marco de proxy dinámico y funciona bien (con clases/interfaces de paquete). La única característica sobresaliente del marco es burlarse de las clases "privadas" (declaradas fuera del paquete). –

+0

¡Guau, entonces realmente debo comprobarlo! ¿Asumo que no hiciste esto con las capacidades estándar de AS3? –

+0

En realidad, solo estoy usando Loader.loadBytes().Generar un SWF/ABC dinámico en tiempo de ejecución fue la parte difícil;) –

1

No estoy seguro de lo que entendemos por PRIVATE_NS ("ContainerClass.as $ 123"), Mi La lectura de avm2overview.pdf 4.4.1 es que no se permite que los espacios de nombres privados tengan un nombre, de ahí que se genere el espacio de nombre "< class> $ < number>" en la salida de depuración para su conveniencia. Supongo que significaría que tendría que hackear su abc en la misma etiqueta abc en el archivo fuente swf para acceder al índice constante del espacio de nombres (y eso me suena demasiado duro)

No lo he hecho Sin embargo, se las arregló para generar un swf de carga, así que tómenlo con un grano de sal.

+0

4.4.1 designa que los espacios de nombres SYSTEM están vacíos (es decir, String, int, etc.), pero los espacios de nombres privados (es decir, aquellos con un tipo de PrivateNs/0x5 de la multinacional) aún tienen nombres) todavía tienen valores. .as $ se asigna automáticamente como la multinacional (privada) a las clases anidadas. –

+0

Además, el marco en el que estoy trabajando genera un swf de carga y admite la generación de todos los tipos de clases (incluido Vector ). Solo las clases "anidadas" me están causando dolor. Si está interesado en el trabajo hasta el momento, la fuente está disponible en http://asmock.sourceforge.net –

+0

"Los espacios de nombres definidos por el usuario tienen el tipo CONSTANT_Namespace o CONSTANT_ExplicitNamespace y un nombre no vacío. Los espacios de nombres del sistema tienen nombres vacíos y uno de los otros tipos "es el texto en el que estoy pensando aquí. Esto implica que CONSTANT_PrivateNs es un sistema NS y no tiene un nombre almacenado. –

Cuestiones relacionadas