我在一个包中有x个类。"com.trevorboyle。我不断添加更多的类(这些类可能都是静态的,并且可能都扩展同一个类)。
我希望创建所有这些类的下拉列表,最好不必自己手动创建数组。
一旦从列表中选择了一个类,我将能够使用getDefinitionByName来返回它,因为此时我将知道它的名称。
问题是,我认为AS3不支持列出特定包中的所有类,是否存在处理此问题的设计模式?
有两种方法:
首先,传统的clean as3实现:
创建一个类,在类初始化时注册你感兴趣的所有类(当它第一次在代码中使用时)。
像这样:
package {
import flash.utils.getQualifiedClassName;
public class ClassesRegister {
private static const PACKAGE_RESOLVER_PATTERN : RegExp = /^(?P<packageName>[a-zA-Z_.]+)::/;
private static const registeredClasses : Object = { };
public static function registerClass ( clazz : Class ) : void {
var packageName : String = PACKAGE_RESOLVER_PATTERN.exec( getQualifiedClassName( clazz ) ).packageName || "";
if ( !registeredClasses[ packageName ] ) {
registeredClasses[ packageName ] = [];
}
registeredClasses[ packageName ].push( clazz );
}
public static function getClassesOfPackage ( packageName : String ) : Array {
return registeredClasses[ packageName ].concat();
}
}
}
初始化时注册的类:
package {
public class SomeClass {
// Add class to register in static initializer
{
ClassesRegister.registerClass( SomeClass );
}
/**
* Class constructor
*/
public function SomeClass () {
}
}
}
还有另一种方法,我自己没有测试过,但很有希望:使用as3commons字节码库
属性definitionNames
中的ByteCodeTypeCache类存储了在扫描的所有字节码中遇到的所有完全限定定义名称。你可以遍历这个列表,取你需要的东西。当然,你必须确保你在运行时需要的所有类都被编译成字节码(你必须在某处初始化这些类或使用as3编译器指令)。