?
在ActionScript 3中,你會(huì)發(fā)現(xiàn)在flash.utils包中有一系列函數(shù)提供了反射的功能。主要包含以下功能:
??? * 確定對(duì)象的類
??? * 獲取類的成員、方法、構(gòu)造函數(shù)、父類的信息
??? * 確定接口聲明的常數(shù)和方法
??? * 在運(yùn)行時(shí)根據(jù)類名創(chuàng)建類的實(shí)例
??? * 在運(yùn)行時(shí)根據(jù)成員名稱獲取或者設(shè)置對(duì)象成員的值
??? * 在運(yùn)行時(shí)根據(jù)方法名稱,調(diào)用對(duì)象的方法
你可以使用類似于"describeType"之類的功能,它返回一個(gè)Xml對(duì)象。舉一個(gè)例子:
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());
??????? }
??? }
}
如果你想進(jìn)一步,根據(jù)類名創(chuàng)建對(duì)象的實(shí)例,我們可以使用"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中使用反射還是會(huì)有許多的限制,因?yàn)槿狈\(yùn)行時(shí)的動(dòng)態(tài)源碼編譯。上面的功能對(duì)于那些在內(nèi)建的類,比如:Sprite類來說無疑是有用的,但是對(duì)于自定義類來說,我們會(huì)遇到很多麻煩。比如:
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()"還是會(huì)失敗。原因上面已經(jīng)說過了,在運(yùn)行時(shí)編譯源代碼是不允許的。也許以后可以。在目前情況下,要實(shí)現(xiàn)上述功能,至少要在代碼中初始化一個(gè)類的實(shí)例。也就是聲明一個(gè)類的實(shí)例:
var customType : com.customtypes.string;
?