加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

AS3的自定义元数据标记

发布时间:2020-12-13 19:56:12 所属栏目:百科 来源:网络整理
导读:在AS3 使用元数据标签最多的应该是swf标签了,如: [SWF(backgroundColor= 0x000000 ,frameRate= 24 ,width= 1000 ,height= 600 )] 那么能不能自定义我们自己的标签,然后在运行时,获取那些含有自定义标签的类或者类成员,然后达到注入的目的呢?答案是肯定

在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

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读