2010-12-16 64 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; 
}