AS3的自定义元数据标记

http://m.blog.csdn.net/blog/cceevv/8779480


在AS3 使用元数据标签最多的应该是swf标签了,如:

 
 
  1. [SWF(backgroundColor = 0x000000, frameRate = 24, width = 1000, height = 600)] 

那么能不能自定义我们自己的标签,然后在运行时,获取那些含有自定义标签的类或者类成员,然后达到注入的目的呢?答案是肯定的,在robotleg等一些开源框架中也用到了注入。

要是有元数据标签需要在编译器的扩展参数中指定-keep-as3-metadatac参数:

 
 
  1. -keep-as3-metadata+=Inject,BindData 

后面的Inject、BindData就是下面的例子要用的两个标签

需要注意的是这个编译参数只需要在一个运行库中指定即可,比如我们使用swc,那么编译这个swc指定了-keep-as3-metadatac参数,那么在使用swc的库的项目是不需要再指定的。在-keep-as3-metadatac参数使用“+=”是为了避免把别的参数定义覆盖掉。

比如Test1.as类使用元标签:

 
 
  1. package 
  2.     /** 
  3.      * ... 
  4.      * @author yoyo 
  5.      */ 
  6.     [Inject]      
  7.     public class Test1 
  8.     { 
  9.         [BindData(param1="abc")] 
  10.         public var s:String = 'ssss'
  11.          
  12.         public function Test1() 
  13.         { 
  14.         } 
  15.      
  16.     } 
  17.  
  18. }; 

接下来我们做注入操作,在不需要直接引用s成员的情况下,根据BindDta标签,修改这个成员变量的值:

 
 
  1. package 
  2.     import flash.display.Sprite; 
  3.     import flash.events.Event; 
  4.     import flash.utils.describeType; 
  5.     import flash.xml.XMLNode; 
  6.      
  7.     /** 
  8.      * ... 
  9.      * @author yoyo 
  10.      */ 
  11.     public class Main extends Sprite 
  12.     { 
  13.          
  14.         public function Main():void 
  15.         { 
  16.             if (stage) 
  17.                 init(); 
  18.             else 
  19.                 addEventListener(Event.ADDED_TO_STAGE, init); 
  20.         } 
  21.          
  22.         private function init(e:Event = null):void 
  23.         { 
  24.             removeEventListener(Event.ADDED_TO_STAGE, init); 
  25.             // describeType方法返回的信息类似下面的xml 
  26.             /** 
  27.                <type name="Test1" base="Object" isDynamic="false" isFinal="false" isStatic="false"> 
  28.                <extendsClass type="Object"/> 
  29.                <variable name="s" type="String"> 
  30.                <metadata name="BindData"> 
  31.                <arg key="param1" value="abc"/> 
  32.                </metadata> 
  33.                <metadata name="__go_to_definition_help"> 
  34.                <arg key="pos" value="131"/> 
  35.                </metadata> 
  36.                </variable> 
  37.                <metadata name="Inject"/> 
  38.                <metadata name="__go_to_ctor_definition_help"> 
  39.                <arg key="pos" value="173"/> 
  40.                </metadata> 
  41.                <metadata name="__go_to_definition_help"> 
  42.                <arg key="pos" value="79"/> 
  43.                </metadata> 
  44.                </type> 
  45.              
  46.              */ 
  47.              
  48.             var t:Test1 = new Test1();   
  49.              
  50.             initMeta(t); 
  51.              
  52.             trace(t.s);//打印修改后的值 
  53.         } 
  54.          
  55.         /** 
  56.          * 开始对这个对象进行注入 
  57.          * @param   obj 
  58.          */ 
  59.         private function initMeta(obj:*):void 
  60.         { 
  61.             var xml:XML = describeType(obj); 
  62.              
  63.             var typeName:String = xml.@name
  64.                          
  65.             initClassMeta(obj,typeName,xml); 
  66.              
  67.             for (var i:int = 0, len:int = xml.variable.length(); i < len;i++) 
  68.             { 
  69.                 var variables:XML = xml.variable[i]; 
  70.              
  71.                 initVariableMeta(obj,typeName,variables); 
  72.             } 
  73.         } 
  74.          
  75.         /** 
  76.          * 获取含有自定义标签的类对象 
  77.          * @param   xml 
  78.          */ 
  79.         private function initClassMeta(obj:*,typeName:String,xml:XML):void 
  80.         { 
  81.             for (var i:int = 0, len:int = xml.metadata.length(); i < len;i++) 
  82.             { 
  83.                 var mata:XML = xml.metadata[i]; 
  84.                 var metaName:String = mata.@name
  85.                 switch (metaName) 
  86.                 { 
  87.                     case 'Inject'
  88.                         trace(typeName + ',Inject:' + metaName); 
  89.                         break
  90.                 } 
  91.             } 
  92.         } 
  93.          
  94.         /** 
  95.          * 获取含有自定义标签的成员变量 
  96.          * @param   xml 
  97.          */ 
  98.         private function initVariableMeta(obj:*,typeName:String,xml:XML):void 
  99.         { 
  100.             var name:String = xml.@name
  101.             var type:String = xml.@type
  102.             for (var i:int = 0, len:int = xml.metadata.length(); i < len;i++) 
  103.             { 
  104.                 var mata:XML = xml.metadata[i]; 
  105.                 var metaName:String = mata.@name
  106.                 switch (metaName) 
  107.                 { 
  108.                     case 'BindData'
  109.                         trace(typeName + ',BindData:' + metaName + '(' + mata.arg[0].@value + ')'); 
  110.                         obj[name] = 'inject';//修改这个成员变量的值 
  111.                         break
  112.                 } 
  113.             } 
  114.         } 
  115.      
  116.     } 

输出如下:


完整代码下载:metaDataTest.zip

作者:YoYo,原文地址:http://yoyo.play175.com/p/186.html


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值