Last active
December 10, 2015 05:18
-
-
Save lynxerzhang/4386957 to your computer and use it in GitHub Desktop.
包外类的使用限制记录
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
诸如目前无法在外部实例化一个可以存储指定包外类类型的Vector对象 | |
问题重现: | |
(使用一个用数组实现的对象池类在存储包外类时, 由于无法获取到包外类的类定义, | |
造成一个"ReferenceError: Error #1065 :xx变量未定义"的报错, 下面假设该包外类类名为TestInternal, 位于gist.github.com包下的Test类中) | |
/** | |
* TODO | |
* 该方法判断指定对象是否为包外类所创建 | |
* @param runIn | |
* | |
* @example | |
* 在 FlashBuilder 中的返回类似于 gist.github.com.Test.as$93::TestInternal | |
* 在 FlashIDE 中的返回类似于 ::TestInternal | |
*/ | |
function isInternalClass(runIn:Object):Boolean{ | |
var name:String = getQualifiedClassName(runIn); | |
if(contain(name, "::")){ | |
//check FlashIDE and FlashBuilder | |
if(getPackageName(runIn) == "" || contain(name, "as")){ | |
return true; | |
} | |
} | |
return false; | |
} | |
/** 获取指定对象的类定义 **/ | |
function getClass(d:*):Class{ | |
//由于这个包外类问题, 添加了如下判断, 并使用constructor属性返回类定义 | |
if(isInternalClass(d)){ | |
return Object(d).constructor; | |
} | |
return getDefinitionByName(getQualifiedClassName(d)) as Class; //对于非包外类, 返回正常 | |
} | |
/** | |
* 返回str中是否包含mathStr字符串 | |
* check contain specfied string | |
*/ | |
function contain(str:String, mathStr:String):Boolean{ | |
var fi:int = str.indexOf(mathStr); | |
if(fi != -1){ | |
return str.substr(fi, mathStr.length) == mathStr; | |
} | |
return false; | |
} | |
/** | |
* get specfied object's package name | |
* @param runIn | |
*/ | |
function getPackageName(runIn:Object):String{ | |
var name:String = getQualifiedClassName(runIn); | |
return name.substring(0, name.indexOf("::")); | |
} | |
当到了该实例化这个Vector对象时问题又出现了, 由于在外部获取到的包外类类名称无法在创建Vector对象时使用,所以 | |
目前暂时无法动态创建出一个可以存储指定包外类类型的Vector对象。 | |
非包外类的话可以用如下方式实例化(运用的是as3中的反射机制): | |
private static const VECTOR:String = getQualifiedClassName(Vector); | |
var typeName:String = VECTOR + ".<" + getQualifiedClassName(type) + ">"; | |
var typeCls:Class = getDefinitionByName(e) as Class; //当new的时候就能获取类型为type的Vector对象 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment