2011-06-19 50 views
5

我正在做一個涉及自省的Actionscript 3.0項目。我想知道是否有一種方法可以獲得給定包結構中的所有類。 例如假設有三個AS3類: com.example.test.classOne com.example.test.classTwo com.example.test.classThree閱讀包中的所有類或閱讀具有相同元數據在ActionScript 3.0中的類

我希望能夠說

getClassesUnderPackageName("com.example.test"); 

和回來

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

有沒有辦法做到這一點?

如果這是不可能的,有沒有辦法讀取具有相同元數據的類?

例如如果所有提到的類具有相同的元數據[MetadataName(TYPE =「例如」)規定,有沒有辦法說

getClassesWithSameMetadata("MetadataName"); 

,並取回

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

謝謝。

回答

1

您可以使用flash.utils.describeType返回包含此信息的XML數據。它的工作原理不同的基類,像flash.display.Sprite,但對於定製類/目錄,你可以寫這樣的事情:

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 

,如果你想返回的基類,你可以寫這樣的事情:

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 

還有很多其他有用的信息可以通過解析describeType返回的XML數據來獲得。


更新:

類對象不需要一直以檢索通過的describeType他們的信息第一被實例化()。您可以構建一個公共靜態函數(或其他),它接受一個類對象的數組並返回一個包含所需describeType數據的字符串數組。

是這樣的:

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; 
     } 
    } 
} 

然後從你的程序的任何地方,你可以把所有的類的數組是這樣的:

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

只有當我明確地調用構造函數或包含「describeType」的函數時,這纔會起作用。我的問題是,如果有一個幫助器函數可以通過調用類似於describeType的函數來返回包中的所有類。 – Djokovic

+0

我不太關注。對於這個非常罕見的問題,肯定沒有現成的幫手功能。你會使用describeType來創建自己的靜態函數或任何你想要的。 – TheDarkIn1978

+0

噢,好的。我正在尋找類似Java使用的註釋。但是,我可以使用describeType()。謝謝! – Djokovic

1

有尋找類,而已經沒有內在機制知道班級名稱。 :(

但是,如果你在一個SWF文件加載爲ByteArray那麼就可以通過類在裏面循環。

這可能是矯枉過正,你想要的東西。

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

1

看看AS3 Commons Bytecode。它允許你做Bytecode based reflection。您可以列出所有類(如果您只想要特定的包,則需要過濾這些類),列出具有某些元數據的類或實現特定界面的類。