Skip to content

Instantly share code, notes, and snippets.

@lynxerzhang
Last active December 10, 2015 05:18
Show Gist options
  • Save lynxerzhang/4386957 to your computer and use it in GitHub Desktop.
Save lynxerzhang/4386957 to your computer and use it in GitHub Desktop.
包外类的使用限制记录
诸如目前无法在外部实例化一个可以存储指定包外类类型的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