我正在做一个涉及内省的Actionscript 3.0项目。我想知道是否有一种方法可以获得给定包结构中的所有类。例如,假设有三个as3类:com.example.test.classOnecom.example.test.classTwocom.example.test.classThree
我想说
getClassesUnderPackageName("com.example.test");
并取回
"com.example.test::classOne"
"com.example.test::classTwo"
"com.example.test::classThree".
有办法做到这一点吗?
如果这不可能,有没有办法读取具有相同元数据的类?
例如,如果所有提到的类都定义了相同的元数据[MetadataName(type="example")],有没有办法说
getClassesWithSameMetadata("MetadataName");
并取回
"com.example.test::classOne"
"com.example.test::classTwo"
"com.example.test::classThree".
谢谢。
您可以使用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).@name);
}
}
}
//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).@base);
}
}
}
//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(classObject.@name.toString()));
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
没有内置机制可以在不知道类名的情况下查找类(
但是,如果您将SWF加载为ByteArray,则可以迭代其中的类。
对于你想要的东西来说,这可能有些过头了。
http://www.bytearray.org/?p=175
看看AS3 Commons字节码。它允许您进行基于字节码的反射。您可以列出所有类(如果您只想要一个特定的包,则需要筛选这些类),列出具有特定元数据的类或实现特定接口的类。