2011-06-19 16 views
5

Sto facendo un progetto Actionscript 3.0 che coinvolge l'introspezione. Mi chiedo se c'è un modo per ottenere tutte le classi all'interno di una determinata struttura del pacchetto. Ad es. Dicono che ci sono tre classi AS3: com.example.test.classOne com.example.test.classTwo com.example.test.classThreeLeggere tutte le classi in un pacchetto o leggere classi con gli stessi metadati in Actionscript 3.0

voglio essere in grado di dire

getClassesUnderPackageName("com.example.test"); 

e torna

"com.example.test::classOne" 
    "com.example.test::classTwo" 
    "com.example.test::classThree". 

C'è un modo per farlo?

Se questo non è possibile, c'è un modo per leggere le classi che hanno gli stessi metadati?

E.g. Se tutte le classi citate hanno gli stessi metadati [MetadataName (type = "example")] definito, c'è un modo per dire

getClassesWithSameMetadata("MetadataName"); 

e tornare

"com.example.test::classOne" 
    "com.example.test::classTwo" 
    "com.example.test::classThree". 

Grazie.

risposta

1

è possibile utilizzare flash.utils.describeType per restituire dati XML contenenti queste informazioni. funziona in modo diverso su classi di base, come flash.display.Sprite, ma per personalizzati classi/directory, è possibile scrivere qualcosa di simile:

package branchA.branchB.branchC 
{ 
//Imports 
import flash.utils.describeType; 

//Class 
public class Test 
    { 
    //Constructor 
    public function Test() 
     { 
     trace(describeType(this)[email protected]); 
     } 
    } 
} 

//OUTPUT: branchA.branchB.branchC::Test 

se si voleva restituire la classe di base, si potrebbe scrivere qualcosa di simile:

package 
{ 
//Imports 
import flash.display.Sprite; 
import flash.utils.describeType; 

//Class 
public class Test extends Sprite 
    { 
    //Constructor 
    public function Test() 
     { 
     trace(describeType(this)[email protected]); 
     } 
    } 
} 

//OUTPUT: flash.display::Sprite 

ci sono molte altre informazioni utili che è possibile ottenere analizzando i dati XML restituiti di describeType.


Aggiornamento:

oggetti di classe non hanno bisogno di essere stato un'istanza prima al fine di recuperare le loro informazioni tramite describeType(). è possibile creare una funzione statica pubblica (o qualsiasi altra cosa) che accetta un array di oggetti classe e restituisce una serie di stringhe contenenti i dati descrittivo richiesti.

qualcosa di simile:

package 
{ 
import flash.utils.describeType; 

final public class Describe 
    { 
    public static function packageNames(classObjects:Array):Vector.<String> 
     { 
     var names:Vector.<String> = new Vector.<String>(); 

     for each (var classObject in classObjects) 
        names.push(describeType([email protected]())); 

     return names; 
     } 
    } 
} 

poi da qualsiasi punto del programma, è possibile passare un array di tutte le classi in questo modo:

var names:Vector.<String> = Describe.packageNames(new Array(classOne, classTwo, classThree)); 
trace(names); 

//Output: 
//com.example.test::classOne 
//com.example.test::classTwo 
//com.example.test::classThree 
+0

Questo funzionerà solo se chiamo il costruttore o una funzione che contiene "describeType" esplicitamente. La mia domanda è se c'è una funzione di aiuto che può restituire tutte le classi all'interno di un pacchetto semplicemente chiamando una funzione simile a describeType. – Djokovic

+0

non seguo abbastanza. non c'è certamente una funzione di aiuto pronta per questo problema molto raro. useresti describeType per creare la tua funzione statica o qualsiasi cosa tu voglia. – TheDarkIn1978

+0

Oh ok. Stavo cercando qualcosa come le annotazioni che usa Java. Ma, posso lavorare con describeType(). Grazie! – Djokovic

1

Non c'è alcun meccanismo integrato per trovare le classi senza già conoscendo il nome della classe. :(

Tuttavia, se si carica in un file SWF come ByteArray allora è possibile scorrere le classi in esso.

questo potrebbe essere eccessivo per quello che si vuole.

http://www.bytearray.org/?p=175

1

Date un'occhiata a AS3 Commons Bytecode. Ti permette di fare Bytecode based reflection. È possibile elencare tutte le classi (è necessario filtrarle se si desidera solo un particolare pacchetto), elencare le classi con determinati metadati o classi che implementano una determinata interfaccia.

Problemi correlati