读取包下的所有类或在Actionscript 3.0中读取具有相同元数据的类

时间:2011-06-19 05:29:31

标签: actionscript-3 class metadata package introspection

我正在做一个涉及内省的Actionscript 3.0项目。我想知道是否有办法获得给定包结构中的所有类。     对于例如假设有三个as3类: com.example.test.classOne com.example.test.classTwo com.example.test.classThree

我希望能够说出

  getClassesUnderPackageName("com.example.test"); 

然后回来

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

有办法吗?

如果这不可能,有没有办法读取具有相同元数据的类?

E.g。如果所有提到的类都定义了相同的元数据[MetadataName(type =“example”)],有没有办法说明

   getClassesWithSameMetadata("MetadataName");

然后回来

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

谢谢。

3 个答案:

答案 0 :(得分: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).@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

答案 1 :(得分:1)

在没有知道类名的情况下,没有用于查找类的内置机制。 :(

但是,如果您将SWF作为ByteArray加载,则可以遍历其中的类。

这可能对你想要的东西有点过分。

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

答案 2 :(得分:1)

看看AS3 Commons Bytecode。它允许您执行Bytecode based reflection。您可以列出所有类(如果只需要特定包,则需要过滤这些类),列出具有某些元数据的类或实现特定接口的类。