[轉]FLEX2/ACTIONSCRIPT3 的反射

wenmin311發表於2008-01-28
在ActionScript 3中,你會發現在flash.utils包中有一系列函式提供了反射的功能。主要包含以下功能:

* 確定物件的類
* 獲取類的成員、方法、建構函式、父類的資訊
* 確定介面宣告的常數和方法
* 在執行時根據類名建立類的例項
* 在執行時根據成員名稱獲取或者設定物件成員的值
* 在執行時根據方法名稱,呼叫物件的方法

你可以使用類似於"describeType"之類的功能,它返回一個Xml物件。舉一個例子:


package {
import flash.display.Sprite;
import flash.utils.describeType;

public class DescribeTypeExample extends Sprite {
public function DescribeTypeExample() {
var child:Sprite = new Sprite();
var description:XML = describeType(child);
trace(description..accessor.@name.toXMLString());
}
}
}


如果你想進一步,根據類名建立物件的例項,我們可以使用"getDefinitionByName()"

package {
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.utils.getDefinitionByName;

public class GetDefinitionByNameExample extends Sprite {
private var bgColor:uint = 0xFFCC00;
private var size:uint = 80;

public function GetDefinitionByNameExample() {
var ClassReference:Class = getDefinitionByName(“flash.display.Sprite”) as Class;
var instance:Object = new ClassReference();
instance.graphics.beginFill(bgColor);
instance.graphics.drawRect(0, 0, size, size);
instance.graphics.endFill();
addChild(DisplayObject(instance));
}
}
}


儘管這是一些非常方便的方法,但是在FlashPlayer中使用反射還是會有許多的限制,因為缺乏執行時的動態原始碼編譯。上面的功能對於那些在內建的類,比如:Sprite類來說無疑是有用的,但是對於自定義類來說,我們會遇到很多麻煩。比如:


package {
import com.customtypes.string; // Custom String Implementation Class
import flash.utils.getDefinitionByName;

public class GetDefinitionByNameExample {
public function GetDefinitionByNameExample() {
var ClassReference:Class = getDefinitionByName(“com.customtypes.string”) as Class;
var instance:Object = new ClassReference();
instance.customParameter = “my parameter”;
}
}
}


儘管我們使用了import語句,但是"getDefinitionByName()"還是會失敗。原因上面已經說過了,在執行時編譯原始碼是不允許的。也許以後可以。在目前情況下,要實現上述功能,至少要在程式碼中初始化一個類的例項。也就是宣告一個類的例項:


var customType : com.customtypes.string;

相關文章