我正在使用优秀的org.as3commons.reflect和org.as3commons.lang库,并遇到了障碍。我的一个类中有一个静态方法,需要对它的类进行反射。反射库有一个Type.forClass(clazz:Class)静态方法,显然需要一个Class变量。静态方法/代码中不允许使用 this 关键字,所以现在我需要知道是否有办法获取调用静态方法的类。
我需要能够在非调试版本的Flash播放器中运行的东西,因此任何Error.getStackTrace()技巧都不起作用。太糟糕了,普通虚拟机中没有可用的堆栈跟踪。
import org.as3commons.lang.ClassUtils;
import org.as3commons.reflect.Type;
protected static function doReflection(): void
{
var aClass: Class = ClassUtils.forInstance(this); // this not allowed in static methods
var ct: Type = Type.forClass(aClass);
// do stuff with type
}
我放弃了在Google和其他网站上的搜索;总是得到关于静态成员,性能问题,一切的所有内容的教程和提示,除了我正在寻找的内容。
总的来说,我想在静态成员中缓存一堆关于类的东西,以便在每次实例化类时节省不必要的工作。
任何帮助都将不胜感激。
答案 0 :(得分:1)
如何将对所需实例的引用作为静态方法的参数传递?
答案 1 :(得分:1)
它可能不适用于所有情况......主要取决于构造函数上发生的情况。
import org.as3commons.lang.ClassUtils;
import org.as3commons.reflect.Type;
static private const CLASS:Object = new YourReflectedClass;
protected static function doReflection(): void {
// var aClass: Class = ClassUtils.forInstance(this); // this not allowed in static methods
var aClass:Class = CLASS.constructor;
var ct: Type = Type.forClass(aClass);
// do stuff with type
}
更好的方法是使用:
static private const CLASS:Class = YourReflectedClass;
var ct: Type = Type.forClass(CLASS);
只是想向您展示Object.constructor方法......
答案 2 :(得分:1)
我认为在调试模式下,您可以使用错误对象的堆栈跟踪从静态上下文中检索/反映该类,但在发布版本中,您必须获得全局范围以反映:
//RELEASE BUILD
public static function whoAmI():void
{
var clsName:String = describeType((function m():*{return this})()).constant.@type;
var cls:Class = getDefinitionByName(clsName) as Class;
}
//DEBUG MODE (getStackTrace()-hack)
public static function whoAmI():void
{
var stack:Array = new Error().getStackTrace().replace("Error\n","").split("\n");
//write your stack-trace parser here
var clsName:String = ...
var cls:Class = getDefinitionByName(clsName) as Class;
}
答案 3 :(得分:0)
这个怎么样:
protected static function doReflection(): void
{
var aClass: Class = ClassThatYouAreIn as Class;
var ct: Type = Type.forClass(aClass);
// do stuff with type
}
因为静态方法甚至没有继承......
编辑:好的,我刚看到这已经提出了......