简单来说,元数据metadata就是:data about data,描述数据的数据,是比数据还原始的数据。一个网页有元数据,一张图片有元数据,一个as类也有元数据。
详见http://baike.baidu.com/view/107838.htm
as中元数据有如下几个用途:
- 提供给编译器使用,用于配置改变原有的代码行为,如Bindable、Embed、SWF等。
- 提供给IDE使用,让IDE能够给出更加人性化的帮助信息,如Exclude、Deprecated、Inspectable等。
- 为代码提供配置信息,结合程序的反射机制,可以从宏观上对程序行为进行干预,比如一些第三方框架提供的metadata。
自定义元数据的用处主要是用于上面提到的第三点,Flash的元数据无需定义,只需要在编译时加上对你使用的元数据的支持即可(这是因为在发布成正式版SWF时,metadata会被当做注释清理掉)。如果需要IDE提示,可使用4.5.1以上的Flex SDK,并模仿SDK内提供的metadata.xml编写自己的metadata.xml编译进一个独立的SWC里并引入到你目前开发的项目中,Flash builder会根据该配置文件提供代码提示功能。
在使用上,可以通过describeType对一个类或对象进行解析,从中提取metadata信息并对标注了的成员进行控制。举个例子:
如果你希望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>