• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            twzheng's cppblog

            『站在風口浪尖緊握住鼠標旋轉!』 http://www.cnblogs.com/twzheng

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              136 隨筆 :: 78 文章 :: 353 評論 :: 0 Trackbacks

            什么是反射
            反射 (Reflection) 是指在程序在運行時 (run-time) 獲取類信息的方式. 諸如實現動態創建類實例, 方法等. 在很語言中都有相關的的實現, 如 Java 和 c# 等

            反射有什么用
            在 as3 與 as2 不同, 類實例中任何元素, 如變量 (variable), 訪問器 (accessor, 即 getter / setter), 方法 (method) 都是不可被 for..in 遍歷的 (不是默認哦, 目前我還沒找到辦法可以讓他被遍歷),
            并且不管你是否繼承自 Object (默認繼承就是 Object, 不寫也一樣), 是否把類聲明為 dynamic.
            或許有人會問自然是 Object 的子類, 不是可以用 setPropertyIsEnumerable 來設置是否隱藏變量么.
            很遺憾的是經過的我的嘗試, 在類里使用 setPropertyIsEnumerable("屬性名") 編譯器報告方法可能未定義.
            隨后嘗試 super.setPropertyIsEnumerable("屬性名"), 編譯通過但拋運行時錯誤, 同樣是方法未定義 -_-
            而其他方法諸如 propertyIsEnumerable("屬性名") 卻可以正常使用

            新建一個 ActionScript 項目, 分別創建下面 2 個類:

            Dummy.as

            代碼拷貝框

            [Ctrl+A 全部選擇 然后拷貝]

            ReflectionSample.as

            代碼拷貝框

            [Ctrl+A 全部選擇 然后拷貝]

            最后測試 ReflectionSample, 記得用 debug 模式. 控制臺中只會出現:

            QUOTE:
            ------------------------------------------------------------
            測試 for..in 循環, 遍歷 Dummy 的實例
            ------------------------------------------------------------

            顯然 dummy 中的元素都沒有被遍歷出.

            在 as1, 2 中很簡單就可以實現的問題在 as3 得換個辦法了, 誰讓他們是傳統的腳本語言呢.而在 as3 中, 就得通過反射來解決這個問題了. 方法會在文后介紹

            動態創建實例

            * 這部分內容幫助中已經有例子, 我摘要一些翻譯一下, 不過我的 e 文很爛. 希望大家能看得懂.

            as3 使用 flash.util.getDefinitionByName 動態獲取類 (Class) 引用
            幫助中該方法的描述 :

            QUOTE:
            ------------------------------------------------------------
            public function getDefinitionByName(name:String):Object
            返回參數 name 中指定的類引用

            參數  name:String - 類名稱
            返回  Object - 返回參數 name 中指定的類引用
            錯誤  ReferenceError - 找不到參數 name 對應的公共定義
            ------------------------------------------------------------

            使用方法如下:

            獲取類 flash.text.TextField 的引用. as 語句是無異常的類型轉換. 如果轉換失敗那么目標變量將被設置成 null

            var ClassReference:Class = getDefinitionByName("flash.text.TextField") as Class;

            實例化所引用的類, 并設置一些屬性

            var instance:TextField = new ClassReference() as TextField;
            instance.autoSize = "left";
            instance.text = "我通過 getDefinitionByName 動態創建";

            最后添加到場景中并顯示

            addChild(instance);

            修改后的 ReflectionSample.as:

            代碼拷貝框

            [Ctrl+A 全部選擇 然后拷貝]

            動態獲取類名稱, 超類 (Superclass) 名稱
            有點像之前版本中的 typeof, 這個方法返回的是字符串

            QUOTE:
            ------------------------------------------------------------
            public function getQualifiedClassName(value:*):String
            返回類的完全限定名 (fully qualified class name, qualified 我不知道怎么翻了..)

            參數  value:* - 想要得到完全限定名的對象. 他可以是任何 ActionScript 類型, 對象實例, 簡單類型如 uint 以及類類型. 
            返回  String - 包含類的完全限定名的字符串
            ------------------------------------------------------------

            QUOTE:
            ------------------------------------------------------------
            public function getQualifiedSuperclassName(value:*):String
            返回目標對象基類的完全限定名,
            本函數提供比 describeType 更簡便的方法來獲取基類的名稱
            提示: 本函數限制只尋找實例的繼承層次,而 describeType() 函數使用的是類對象繼承.
            調用 describeType() 函數時返回的是基于超類以的類繼承結構. 而 getQualifiedSuperclassName() 將忽略類的繼承結構直接返回最接近的繼承對象
            例如, 理論上 String 類繼承自 Class, 但調用 getQualifiedSuperclassName(String) 時返回的是 Object. 換句話說, 不管你傳遞的是類還是類的實例, 他們的返回值都是一樣的

            參數  value:* - 任何值. 
            返回  String - 基類的完全限定名, 如果沒有的話返回 null
            ------------------------------------------------------------

            例子:

            實例化新的 Sprite, 然后獲取他的類名并輸出

            var sprite1:Sprite = new Sprite();
            var classNameOfSprite:String = getQualifiedClassName(Sprite);
            trace("Sprite 的類名 : " + classNameOfSprite); // Sprite 的類名 : flash.display::Sprite

            超類

            var superclassNameOfSprite:String = getQualifiedSuperclassName(Sprite);
            trace("Sprite 的超類 (基類) 類名 : " + superclassNameOfSprite); // Sprite 的超類 (基類) 類名 : flash.display::DisplayObjectContainer

            根據剛剛獲取的類名使用 創建實例

            var SpriteClass:Class = getDefinitionByName(classNameOfSprite) as Class;
            var sprite2:Sprite = new SpriteClass() as Sprite;
            trace("sprite2 通過 getDefinitionByName 創建 Sprite 實例");

            畫一個 100 x 100 的矩形并顯示

            sprite2.graphics.beginFill(0xFF00FF);
            sprite2.graphics.drawRect(0, 0, 100, 100);
            sprite2.graphics.endFill();
            addChild(sprite2);

            修改后的 ReflectionSample.as

            代碼拷貝框

            [Ctrl+A 全部選擇 然后拷貝]

            獲取類信息

            QUOTE:
            ------------------------------------------------------------

            public function describeType(value:*):XML
            生成一個 XML 對象來描述參數中指定的 ActionScript 對象, 這個方法使 ActionScript 實現了反射編程的概念.

            如果參數 value 是某類的實例, 那么返回的 XML 對象包含了此類中所有的實例屬性, 但是不會包含任何的靜態屬性.
            這種情況下你可以通過檢查標簽 <type> 中的 isStatic 屬性來判斷他, 當參數為某類的實例時, 這個值為 false.

            要獲取類的靜態屬性, 可以通過傳遞類本身到參數 value, 這樣返回的 XML 對象不僅包括了類的靜態屬性, 也包括所有的實例屬性.
            實例屬性被包含在 <factory> 標簽中使它們和靜態屬性區別開來. 在這種情況下, <type> 標簽的 isStatic 屬性為 true.

            提示: 如果你只需要獲取對象的繼承結構而不需要 describeType() 提供的其他信息, 可以使用 getQualifiedClassName() 和 getQualifiedSuperclassName() 來替代

            下表描述了 describeType() 生成的 XML 的標簽和屬性 (按運行代碼察看)
            ------------------------------------------------------------

            運行代碼框

            [Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]

            另外, 由 describeType() 返回的類描述信息中只會含有所有可被訪問的元素, 即所有非定義為 private 的元素.

            解釋了這么多, 我們來看看返回的 XML 格式
            flash 的內置類 flash.display.Sprite :

            trace(describeType(Sprite);

            返回:

            代碼拷貝框

            [Ctrl+A 全部選擇 然后拷貝]

            真是又臭又長啊. :o, 根據幫助中的描述, 所有的實例屬性都被嵌套在了 <factory> 標簽里.

            posted on 2007-09-27 23:09 譚文政 閱讀(1334) 評論(0)  編輯 收藏 引用 所屬分類: Flash ActionScript
            精品国产乱码久久久久久浪潮 | 久久无码人妻一区二区三区| 久久亚洲AV无码精品色午夜麻豆| 亚洲中文字幕无码一久久区| 国产午夜免费高清久久影院| 久久99精品久久久久久秒播| 久久人妻AV中文字幕| 国产精品久久免费| 亚洲国产成人乱码精品女人久久久不卡| 久久综合亚洲色一区二区三区| 久久婷婷国产综合精品 | 亚洲国产精品无码久久SM | 亚洲精品WWW久久久久久| 色综合久久久久久久久五月| 国产精品欧美亚洲韩国日本久久| 国产色综合久久无码有码| 精品久久国产一区二区三区香蕉| 亚洲va久久久噜噜噜久久狠狠| 久久国产成人午夜AV影院| 久久精品国产亚洲AV大全| 精品国产乱码久久久久久人妻| 99久久国产亚洲高清观看2024| 久久婷婷五月综合97色一本一本| 亚洲欧美国产日韩综合久久| 狠狠色丁香婷婷综合久久来来去 | 欧美激情精品久久久久| 久久久久久人妻无码| 欧美日韩精品久久久免费观看| 欧美一级久久久久久久大| 色综合久久中文综合网| 久久精品国产亚洲77777| 精品人妻伦九区久久AAA片69| 久久精品综合网| 久久精品视频一| 精品久久久中文字幕人妻| 精品久久久久成人码免费动漫| 亚洲国产综合久久天堂| 污污内射久久一区二区欧美日韩| 深夜久久AAAAA级毛片免费看| 久久久久久毛片免费看| 亚洲国产小视频精品久久久三级|