[轉]FLEX2/ACTIONSCRIPT3 的反射
在ActionScript 3中,你會發現在flash.utils包中有一系列函式提供了反射的功能。主要包含以下功能:
* 確定物件的類
* 獲取類的成員、方法、建構函式、父類的資訊
* 確定介面宣告的常數和方法
* 在執行時根據類名建立類的例項
* 在執行時根據成員名稱獲取或者設定物件成員的值
* 在執行時根據方法名稱,呼叫物件的方法
你可以使用類似於"describeType"之類的功能,它返回一個Xml物件。舉一個例子:
如果你想進一步,根據類名建立物件的例項,我們可以使用"getDefinitionByName()"
儘管這是一些非常方便的方法,但是在FlashPlayer中使用反射還是會有許多的限制,因為缺乏執行時的動態原始碼編譯。上面的功能對於那些在內建的類,比如:Sprite類來說無疑是有用的,但是對於自定義類來說,我們會遇到很多麻煩。比如:
儘管我們使用了import語句,但是"getDefinitionByName()"還是會失敗。原因上面已經說過了,在執行時編譯原始碼是不允許的。也許以後可以。在目前情況下,要實現上述功能,至少要在程式碼中初始化一個類的例項。也就是宣告一個類的例項:
* 確定物件的類
* 獲取類的成員、方法、建構函式、父類的資訊
* 確定介面宣告的常數和方法
* 在執行時根據類名建立類的例項
* 在執行時根據成員名稱獲取或者設定物件成員的值
* 在執行時根據方法名稱,呼叫物件的方法
你可以使用類似於"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;
相關文章
- struct轉map (反射)Struct反射
- JAVA反射通俗易懂轉Java反射
- [轉載] python通過反射執行程式碼Python反射行程
- Python的反射Python反射
- Java的反射Java反射
- .Net 中的反射(反射特性) - Part.3反射
- 【型別轉換】使用c#實現簡易的型別轉換(Emit,Expression,反射)型別C#MITExpress反射
- java反射構建物件和方法的反射呼叫Java反射物件
- Java反射與hook混用反射某支付的方法Java反射Hook
- 反射的應用反射
- Kotlin中的反射Kotlin反射
- Swift中的反射Swift反射
- Java 方法的反射Java反射
- 反射,註解,動態代理,依賴注入控制反轉反射依賴注入
- 00024.06 反射:反射的應用2:動態建立物件反射物件
- Java反射—初探反射基礎Java反射
- 反射反射
- 學習記錄-Laravel 核心 依賴注入 控制反轉 反射Laravel依賴注入反射
- Java的反射機制Java反射
- 反射的深入淺出反射
- 說說java的反射Java反射
- 【Java 反射學習】Java 反射基礎Java反射
- [Java 反射學習] Java 反射基礎Java反射
- Unity反射的幾種方式Unity反射
- 淺談java中的反射Java反射
- 反射機制的基本用法反射
- Java 中的 反射機制Java反射
- 淺談Java的反射原理Java反射
- 反射的基本原理反射
- 反射、特性反射
- 反射 Reflection反射
- Java反射Java反射
- Java——反射Java反射
- .NET 反射反射
- Go 反射Go反射
- php反射PHP反射
- Java 反射Java反射
- 【Java面試指北】反射(1) 初識反射Java面試反射
- 你必須瞭解的反射——反射來實現實體驗證反射