AS3的自定义元数据标记

前端之家收集整理的这篇文章主要介绍了AS3的自定义元数据标记前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在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类使用元标签

  
  
  • package
  • {
  • /**
  • *...
  • *@authoryoyo
  • */
  • [Inject]
  • publicclassTest1
  • {
  • [BindData(param1="abc")]
  • publicvars:String='ssss';
  • publicfunctionTest1()
  • {
  • }
  • }
  • };
  • 接下来我们做注入操作,在不需要直接引用s成员的情况下,根据BindDta标签修改这个成员变量的值:

    package
      
      
  • {
  • importflash.display.Sprite;
  • importflash.events.Event;
  • importflash.utils.describeType;
  • importflash.xml.XMLNode;
  • /**
  • *...
  • *@authoryoyo
  • */
  • classMainextendsSprite
  • {
  • publicfunctionMain():void
  • {
  • if(stage)
  • init();
  • else
  • addEventListener(Event.ADDED_TO_STAGE,init);
  • }
  • privatefunctioninit(e:Event=null):void
  • {
  • removeEventListener(Event.ADDED_TO_STAGE,init);
  • //describeType方法返回的信息类似下面的xml
  • <typename="Test1"base="Object"isDynamic="false"isFinal="false"isStatic="false">
  • <extendsClasstype="Object"/>
  • <variablename="s"type="String">
  • <Metadataname="BindData">
  • <argkey="param1"value="abc"/>
  • </Metadata>
  • <Metadataname="__go_to_definition_help">
  • <argkey="pos"value="131"/>
  • </Metadata>
  • </variable>
  • <Metadataname="Inject"/>
  • <Metadataname="__go_to_ctor_definition_help">
  • <argkey="pos"value="173"/>
  • <argkey="pos"value="79"/>
  • </type>
  • */
  • vart:Test1=newTest1();
  • initMeta(t);
  • trace(t.s);//打印修改后的值
  • }
  • *开始对这个对象进行注入
  • *@paramobj
  • privatefunctioninitMeta(obj:*):void
  • {
  • varxml:XML=describeType(obj);
  • vartypeName:String=xml.@name;
  • initClassMeta(obj,typeName,xml);
  • for(vari:int=0,len:int=xml.variable.length();i<len;i++)
  • {
  • varvariables:XML=xml.variable[i];
  • initVariableMeta(obj,variables);
  • }
  • }
  • *获取含有自定义标签的类对象
  • *@paramxml
  • privatefunctioninitClassMeta(obj:*,typeName:String,xml:XML):void
  • {
  • int=xml.Metadata.length();i<len;i++)
  • {
  • varmata:XML=xml.Metadata[i];
  • varMetaName:String=mata.@name;
  • switch(MetaName)
  • {
  • case'Inject':
  • trace(typeName+',Inject:'+MetaName);
  • break;
  • }
  • }
  • }
  • *获取含有自定义标签的成员变量
  • *@paramxml
  • */
  • privatefunctioninitVariableMeta(obj:*,153); background-color:inherit; font-weight:bold">void
  • {
  • varname:String=xml.@name;
  • vartype:String=xml.@type;
  • int=xml.Metadata.length();i<len;i++)
  • {
  • varmata:XML=xml.Metadata[i];
  • varMetaName:String=mata.@name;
  • switch(MetaName)
  • {
  • case'BindData':
  • trace(typeName+',BindData:'+MetaName+'('+mata.arg[0].@value+')');
  • obj[name]='inject';//修改这个成员变量的值
  • break;
  • }
  • }
  • }
  • }
  • }
  • 输出如下:


    完整代码下载:metaDataTest.zip

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

    原文链接:https://www.f2er.com/javaschema/286342.html

    猜你在找的设计模式相关文章