2009-02-09 15 views
7

Sto sviluppando un framework di simulazione dinamica per Flex/AS3 e sto avendo problemi con i tipi di supporto/privati ​​(cioè quelli dichiarati all'esterno del pacchetto {} in un file di classe).Sottoclasse di una classe privata (di supporto) in AVM2

Nel mio "file" ABC, sto dichiarando l'istanza con il flag di classe PROTECTED_NAMESPACE e con un multiname PRIVATE_NS. Ho anche provato a dargli lo stesso spazio dei nomi della classe che sottoclasse (ad esempio PRIVATE_NS ("ContainerClass.as $ 123")).

Non importa quello che faccio, ho sempre arrivare il seguente errore dopo loadBytes:

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

Ho sperimentato con il caricamento del bytecode generato nella stessa ApplicationDomain come la classe privata (io uso un dominio figlio di default). Ho perfino provato a registrare un alias di classe prima del caricamento (anche se era un po 'troppo lungo).

Sto dimenticando qualcosa o è semplicemente una restrizione dell'AVM?

Si noti che sono perfettamente consapevole del fatto che ciò non è consentito in ActionScript 3.0, ma cerco se ciò sia effettivamente possibile in AVM.

Edit: Per chi fosse interessato al lavoro finora, il progetto è asmock ed è su sourceforge.

risposta

0

Essendo tornato a guardare a questo problema in ernest, posso definitivamente rispondere a questa domanda: lezioni private possono essere indicati solo dal LoaderContext che li caricai

sono stato in grado di aggiungere il supporto per privati ​​interfacce riproducendo l'interfaccia nel "file" ABC caricato, ma non può essere forzato/ricondotto all'interfaccia privata originale.

Questo è ancora utile per i miei requisiti, in quanto un'interfaccia privata può essere utilizzata per combinare più interfacce.

1

Non sono esperto di file ABC, ma non penso sia possibile in AVM2. Ho fatto diversi test qualche tempo fa con lo AS3 Eval lib e tutti hanno fallito.

correlati a beffardo dinamica, ho presentato un problema in Adobe bugbase chiedendo il meccanismo di delega dinamica: http://bugs.adobe.com/jira/browse/ASC-3136

+0

In realtà ho sviluppato un framework proxy dinamico e funziona bene (con classi pacchetto/interfacce). L'unica grande caratteristica eccezionale del framework è la derisione delle classi "private" (dichiarate al di fuori del pacchetto). –

+0

Wow, allora devo davvero verificarlo! Suppongo che tu non l'abbia fatto con le funzionalità standard di AS3? –

+0

In realtà, sto solo usando Loader.loadBytes().Generare un SWF/ABC dinamico in fase di esecuzione è stata la parte più difficile;) –

1

Non sono sicuro di cosa si intende per PRIVATE_NS ("ContainerClass.as $ 123"), My la lettura di avm2overview.pdf 4.4.1 è che gli spazi dei nomi privati ​​non sono autorizzati ad avere un nome, quindi che il "Nome classe <> $ < numero>" spazio dei nomi nell'output di debug viene generato per comodità. Suppongo che vorrebbe significare che dovresti hackerare il tuo abc nello stesso tag abc nel source swf per accedere all'indice di costante dello spazio dei nomi (e suona troppo come lavoro duro per me!)

Non ho in realtà è riuscito a generare un swf di caricamento, però, quindi prendi questo con un granello di sale.

+0

4.4.1 indica che gli spazi dei nomi SYSTEM sono vuoti (cioè String, int, ecc.), Ma i namespace privati ​​(cioè quelli con un tipo di multiname di PrivateNs/0x5) hanno ancora dei nomi) hanno ancora dei valori. . As $ viene automaticamente assegnato come il multiname (privato) alle classi nidificate. –

+0

Inoltre, il framework su cui sto lavorando genera uno swf di caricamento e supporta la generazione di tutti i tipi di classi (incluso Vector. ). Sono solo le classi "annidate" che mi stanno causando dolore. Se sei interessato al lavoro finora, la fonte è disponibile su http://asmock.sourceforge.net –

+0

"Gli spazi dei nomi definiti dall'utente hanno un buono spazio CONSTANT_Names o CONSTANT_ExplicitNamespace e un nome non vuoto Gli spazi dei nomi di sistema hanno nomi vuoti e uno degli altri tipi "è il testo a cui sto pensando. Ciò implica che CONSTANT_PrivateNs è un sistema NS e non ha un nome memorizzato. –

Problemi correlati