云自無心水自閑

          天平山上白云泉,云自無心水自閑。何必奔沖山下去,更添波浪向人間!
          posts - 288, comments - 524, trackbacks - 0, articles - 6
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          ActionScript3.0/Flex2中的反射

          Posted on 2007-02-10 14:32 云自無心水自閑 閱讀(1249) 評論(4)  編輯  收藏 所屬分類: FlexFlex2

          ?

          在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;

          ?




          評論

          # re: ActionScript3.0/Flex2中的反射  回復  更多評論   

          2007-04-05 18:02 by slim
          翻譯的吧
          注明出處
          http://weblogs.thekeunster.com/?p=10

          # re: ActionScript3.0/Flex2中的反射  回復  更多評論   

          2007-09-09 14:39 by bona shen
          而且getDefinitionByName方法不能獲取自定義的類。

          # re: ActionScript3.0/Flex2中的反射[未登錄]  回復  更多評論   

          2007-09-10 14:20 by 云自無心水自閑
          @slim
          Yes, It's a translated article. But not from the URL you pointed out.

          # re: ActionScript3.0/Flex2中的反射[未登錄]  回復  更多評論   

          2007-09-10 14:22 by 云自無心水自閑
          @slim
          I forgot the URL now, but it should be a blog of the Flex team member.
          主站蜘蛛池模板: 永嘉县| 治多县| 广水市| 东台市| 温宿县| 社旗县| 石柱| 老河口市| 通渭县| 陵川县| 三门峡市| 淮滨县| 凤冈县| 玉田县| 襄樊市| 浮梁县| 东阿县| 杭锦旗| 阿拉善右旗| 肃南| 兴安县| 嘉定区| 嘉义市| 丰顺县| 永丰县| 平谷区| 醴陵市| 沙河市| 阳春市| 循化| 婺源县| 永宁县| 漠河县| 三台县| 观塘区| 新民市| 顺平县| 定州市| 饶阳县| 巍山| 沙河市|