關於元數據

簡單來說,元數據metadata就是:data about data,描述數據的數據,是比數據還原始的數據。一個網頁有元數據,一張圖片有元數據,一個as類也有元數據。

詳見http://baike.baidu.com/view/107838.htm


as中元數據有如下幾個用途:

  1. 提供給編譯器使用,用於配置改變原有的代碼行爲,如Bindable、Embed、SWF等。
  2. 提供給IDE使用,讓IDE能夠給出更加人性化的幫助信息,如Exclude、Deprecated、Inspectable等。
  3. 爲代碼提供配置信息,結合程序的反射機制,可以從宏觀上對程序行爲進行干預,比如一些第三方框架提供的metadata。

自定義元數據的用處主要是用於上面提到的第三點,Flash的元數據無需定義,只需要在編譯時加上對你使用的元數據的支持即可(這是因爲在發佈成正式版SWF時,metadata會被當做註釋清理掉)。如果需要IDE提示,可使用4.5.1以上的Flex SDK,並模仿SDK內提供的metadata.xml編寫自己的metadata.xml編譯進一個獨立的SWC裏並引入到你目前開發的項目中,Flash builder會根據該配置文件提供代碼提示功能。

在使用上,可以通過describeType對一個類或對象進行解析,從中提取metadata信息並對標註了的成員進行控制。舉個例子:

  1. class Base extends Sprite{
  2. [Interval(secends=5)]
  3. public function move()
  4. {
  5. }
  6. }

如果你希望Base和Base的子類的實例被放置到舞臺後,每5秒鐘執行一次被標記了Interval的函數,就可以在Base裏面加入對this的解析(當然通過宏觀監聽addedToStage事件的捕捉過程也可以,一般的框架也採用這種辦法),找到被標記的函數,然後在addedToStage事件加上一個間時執行被標記函數的偵聽器,就可以了,這樣所有繼承自Base的類的實例都可以支持Interval標籤,而不需要寫額外的邏輯來控制。

Flash的metadata和Java的Annotation是類似的技術,然而功能稍弱,也不是強類型,解析控制都沒有Java來的方便,然而適當使用可以降低代碼的複雜度,提高代碼質量,同時用的時候也要謹慎,因爲涉及到反射,對效率有很大的影響,所以什麼時候使用,如何使用都要考慮清楚。

在Flex中自定義元數據(Metadata)標籤(類似[Event],[Bindable])

原文看這裏 

1. 配置編譯器

對於新的Flex項目:在"additional compiler arguments(附加的編譯器參數)"中添加 "-keep-as3-metadata = Meta1,Meta2"。注意,使用逗號來分隔不同的元數據標籤。


提 示:如果項目是ActionScript Library,則添加"keep-as3-metadata"作爲附加的參數,然後將編譯好的SWC載入項目,直接使用定義的元數據標籤即可,無需再 在"additional compiler arguments"中設置附加參數。

2.使用元數據標籤

示例:

package
{
[Meta2(param1 = "param 1 value")]
public class TestClass
{

    [Meta1(param1 = "param 1 value", param2 = "param 2 value")]
    public var test1:String;


    [Meta2(paramA = "param 1 value", paramB = "param 2 value")]
    public function get test2():String
    {
        return null;
    }

    public function set test2(val:String):void
    {
    }

    [Meta1(param1 = "param 1 value")]
    public function someMethod():void
    {
    };

}
}

3. 在運行時使用元數據
只需調用describeType(TestClass)並使用E4X在結果中查找所需的數據即可

<type name="TestClass" base="Class" isDynamic="true" isFinal="true" isStatic="true">
<extendsClass type="Class"/>
<extendsClass type="Object"/>
<accessor name="prototype" access="readonly" type="*" declaredBy="Class"/>
<factory type="TestClass">


 <metadata name="Meta2">
   <arg key="param1" value="param 1 value"/>
 </metadata>
 


 <extendsClass type="Object"/>


 <method name="someMethod" declaredBy="TestClass" returnType="void">
   <metadata name="Meta1">
     <arg key="param1" value="param 1 value"/>
   </metadata>
 </method> 


 <variable name="test1" type="String">
   <metadata name="Meta1">
     <arg key="param1" value="param 1 value"/>
     <arg key="param2" value="param 2 value"/>
   </metadata>
 </variable> 


 <accessor name="test2" access="readwrite" type="String" declaredBy="TestClass">
   <metadata name="Meta2">
     <arg key="paramA" value="param 1 value"/>
     <arg key="paramB" value="param 2 value"/>
   </metadata>
 </accessor>
 


</factory>
</type>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章