静态方法的类反射

时间:2010-12-16 12:45:03

标签: actionscript-3 class reflection static

我正在使用优秀的org.as3commons.reflectorg.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和其他网站上的搜索;总是得到关于静态成员,性能问题,一切的所有内容的教程和提示,除了我正在寻找的内容。

总的来说,我想在静态成员中缓存一堆关于类的东西,以便在每次实例化类时节省不必要的工作。

任何帮助都将不胜感激。

4 个答案:

答案 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
}

因为静态方法甚至没有继承......

编辑:好的,我刚看到这已经提出了......