关于元数据

简单来说,元数据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>


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