2010-12-16 61 views
1

我正在使用优秀的org.as3commons.reflectorg.as3commons.lang库,并遇到了麻烦。我在我的一个类中有一个静态方法,需要在类中进行反射。反射库有一个Type.forClass(clazz:Class)静态方法,显然需要一个Class变量。有没有这个关键字允许在静态方法/代码,所以现在我需要知道是否有一种方法来获取我的静态方法被调用的类。静态方法的类反射

我需要一些能在非调试版本的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和其他网站上搜索;总是最终得到有关静态成员,性能问题,一切除我正在寻找的一切有关的教程和技巧。总的来说,我想在静态成员中缓存一大堆关于类的东西,以便每次类实例化时都可以节省不必要的工作。

任何帮助,将不胜感激。

回答

1

如何将引用传递给需要的实例作为静态方法的参数?

+0

该静态方法在类的第一个实例化时调用,类似于protected static var _classInitialized:Boolean = init();好的,所以代码会变成类似“所有实例检查类是否已被初始化,如果没有,请调用受保护的静态函数init(this)”。希望有一个更直接的方法,但是,这将工作,谢谢。 – Atorian 2010-12-16 14:09:40

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方法...

+0

不错的方法,即Object.constructor的东西,虽然问题是找到类本身,如果没有实例;我知道类A在它的定义中是类A,但是如果类B的子类是类A则不是。我在写这个问题后不久注意到的另一个问题是,当涉及到静态成员的继承时,as3很奇怪,所以我没有知道这是否会为我的目的起作用;我可能会碰壁。具体来说,A类是B类和C类独特的静态变量吗?很难找到有关该主题的明确文件;我仍在挖掘。 – Atorian 2010-12-16 14:42:53

+0

@ Alan G.对静态var继承的一点研究:http:// wonderfl。net/c/lLor – www0z0k 2010-12-16 16:00:19

+0

@ www0z0k谢谢,这是一个有趣的演示。 – Atorian 2010-12-17 09:55:43

0

这个怎么样:

protected static function doReflection(): void 
{ 
    var aClass: Class = ClassThatYouAreIn as Class; 
    var ct: Type = Type.forClass(aClass); 
    // do stuff with type 
} 

因为静态方法甚至不会被继承...

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

1

我认为在调试模式下,您可以使用错误对象的堆栈跟踪从静态上下文中检索/反映类,但在发布版本你必须得到全球范围的反映:

//RELEASE BUILD 
public static function whoAmI():void 
{  
    var clsName:String = describeType((function m():*{return this})())[email protected]; 
    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; 
}