X

AS3动态创建Vector

很久没有写博客了,已经近乎荒废的程度了.不过从现在起还是要坚持写博客了,很多东西做了测试,没有记录下来,很容易就能忘记的.忘记在哪里看到有人说想动态创建Vector只是苦于语法上不允许,不过还是能够绕开语法检查的

// 请不要复制该代码,该代码不可用
var myClass:Class;
var v:Vector.<myClass> = new Vector.<myClass>();

上面的代码会报错”1046: 找不到类型,或者它不是编译时常数: Vector。"
Vector.<ClassName> 的类名不允许是一个变量, 必须是真正的类型名称才行,所以这样就不能动态创建Vector了.
功夫不负有心人,漫天梨花般的思考后,终于发现可以用反射实现动态创建Vector.

反射法创建Vector

/**
 * 获取一个动态Vector.<myclass>
 * @param   myClass
 * @param   appDomain myClass所在的应用程序域,如果null则为当前应用程序域
 * @return 一个动态Vector, null为myClass不存在
 */function getVector(myClass:Class, appDomain:ApplicationDomain = null):*
{
    // 先获取元素类名
    var className:String = getQualifiedClassName(myClass);
    // 拼接成Vector类名
    var vectorName:String = "__AS3__.vec.Vector.<" + className + ">";
    appDomain ||= ApplicationDomain.currentDomain;
    if(appDomain.hasDefinition(vectorName))
    {
        return appDomain.getDefinition(vectorName);
    }

    // 该类不存在
    return null;
}

如果在当前应用程序域里则好办,如果在其他应用程序域里就需要将应用程序域传递过来.
当然也可以使用类的完全限定名来动态获取一个Vector,注意一定要在该类已经被加载到flash player后才能获取.

编后语

这样的需求可能会用来模拟C++的模板吧,但是比起模板是弱了很多,代码提示就完全没有了.

This post was last modified on 2019 年 03 月 04 日 00:29

View Comments (12)

This website uses cookies.