AS3反射

反射这玩意,在一些游戏的框架中的确有其优势,但是注意反射或多或少会影响性能的.

在资源的获取上就 使用了反射 , 得到SWF中的美术的资源 如:

public static function getClazz(className : String,loader : Loader = null) : Class{
    if(null == loader){
        loader = UI_LOADER;
    }
    return loader.contentLoaderInfo.applicationDomain.getDefinition(className) as Class;
}

当然,像MovieClip,Sprite等除了 使用 new , 还可以用反射 来使它们实例化.

var mcClass:Class = getDefinitionByName("flash.display.MovieClip") as Class;
var mc:MovieClip = new mcClass() as MovieClip;

扩展一下:这个getDefinitionByName其实很有用,也可以反射自己自定义的类:

package com.ainy.factorymanager{
    public class AnimalFactory{
        }
}

那么反射 自定义类:

var myClass:Class = getDefinitionByName("com.ainy.factorymanager.AnimalFactory") as Class;
var $my : AnimalFactory = new myClass() as AnimalFactory;

再扩展,可以联想到Java的三大框架当中的反射配置XML,当然也可以制成Json的二进制文件,用AS来读解.

这玩意在某些情况下,确实很好用, 但是 反射 是要多耗性能的.

扩展:

对于getDefinitionByName参数的解释:

package
{
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.utils.getDefinitionByName;
	
	public class AonauflyTest extends Sprite
	{
		public function AonauflyTest()
		{
			var $reflex_class : Class = getDefinitionByName("flash.text.TextField") as Class;
			var $txt_reflex : TextField = new $reflex_class() as TextField;
			$txt_reflex.text = "getDefinitionByName(\"flash.text.TextField\")";
			$txt_reflex.width = 250;
			this.stage.addChild( $txt_reflex );
		}
	}
}

得到的结果:

package
{
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.utils.getDefinitionByName;
	
	public class AonauflyTest extends Sprite
	{
		public function AonauflyTest()
		{
			var $reflex_class : Class = getDefinitionByName("flash.text::TextField") as Class;
			var $txt_reflex : TextField = new $reflex_class() as TextField;
			$txt_reflex.text = "getDefinitionByName(\"flash.text::TextField\")";
			$txt_reflex.width = 250;
			this.stage.addChild( $txt_reflex );
		}
	}
}

结果:

可见 flash.text::TextField 和 flash.text.TextField的效果是一样的

返回对象的完全限定名:

package
{
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.utils.getDefinitionByName;
	import flash.utils.getQualifiedClassName;
	import flash.utils.getQualifiedSuperclassName;
	import avmplus.getQualifiedSuperclassName;
	
	public class AonauflyTest extends Sprite
	{
		public function AonauflyTest()
		{
			var $reflex_class : Class = getDefinitionByName("flash.text::TextField") as Class;
			var $txt_reflex : TextField = new $reflex_class() as TextField;
//			$txt_reflex.text = "getDefinitionByName(\"flash.text::TextField\")";
			$txt_reflex.width = 250;
			this.stage.addChild( $txt_reflex );
			//返回对象的完全限定名
			var $str : String = avmplus.getQualifiedClassName( TextField );
			$txt_reflex.text =  $str;
		}
	}
}

返回结果:

package
{
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.utils.getDefinitionByName;
	import flash.utils.getQualifiedSuperclassName;
	import avmplus.getQualifiedSuperclassName;
	
	public class AonauflyTest extends Sprite
	{
		public function AonauflyTest()
		{
			var $reflex_class : Class = getDefinitionByName("flash.text::TextField") as Class;
			var $txt_reflex : TextField = new $reflex_class() as TextField;
//			$txt_reflex.text = "getDefinitionByName(\"flash.text::TextField\")";
			$txt_reflex.width = 250;
			this.stage.addChild( $txt_reflex );
			//返回对象的完全限定名
//			var $str : String = avmplus.getQualifiedClassName( TextField );
//			$txt_reflex.text =  $str;
			
			//返回对象的完全限定名
			var $str_1 : String = flash.utils.getQualifiedClassName( TextField );
			$txt_reflex.text = $str_1;
		}
	}
}

返回的结果是一样的(都是::的形式):

返回对象的基类的完全限定名:

引文也有2种方式 , 而且返回的结果都一样,所以直接都写出来:

package
{
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.utils.getDefinitionByName;
	
	import avmplus.getQualifiedSuperclassName;
	
	public class AonauflyTest extends Sprite
	{
		public function AonauflyTest()
		{
			var $reflex_class : Class = getDefinitionByName("flash.text::TextField") as Class;
			var $txt_reflex : TextField = new $reflex_class() as TextField;
//			$txt_reflex.text = "getDefinitionByName(\"flash.text::TextField\")";
			$txt_reflex.width = 250;
			this.stage.addChild( $txt_reflex );
			
			//①
			//返回对象的基类的完全限定名 
//			var $str_super : String = avmplus.getQualifiedSuperclassName( TextField );
//			$txt_reflex.text = $str_super;
			
			//②
			//返回对象的基类的完全限定名
			var $str_super_1 : String = flash.utils.getQualifiedSuperclassName( TextField );
			$txt_reflex.text = $str_super_1;
		}
	}
}

结果:

一个注意(object是所有类的基类,他没有基类,返回null):

//===========================访问类的公共成员================================================================================

使用 :  import flash.utils.describeType;

var xml:XML = describeType(userData); 获取对象的公共(public)成员

package com.model
{
	public class BaseModel
	{
		public function BaseModel()
		{

		}
		private var _id : int;
		
		public function get id() : int
		{
			return this._id;
		}
		
		public function set id( value : int ) : void
		{
			this._id = value;
		}
	}
}
package com.model
{
	public final class UserModel extends BaseModel
	{
		public function UserModel()
		{
			super();
		}
		
		private var _name : String;
		public function set name( value : String ) : void
		{
			this._name = value;
		}
		public function get name() : String
		{
			return this._name;
		}
		
		public var _sex : int = 0;
		private function get sex( ) : int
		{
			return _sex;
		}
		private function set sex( value : int ) : void
		{
			this._sex = value;
		}
		
		private var _occupation : int = 0;
		private function get occupation():int
		{
			return this._occupation;
		}
		public function set occupation( value : int ) : void
		{
			this._occupation = value;
		}
		
		public function doSomething() : void
		{
		}
		private function doPrivateSomething():void
		{
		}
		public function sum( a : int , b : int = 1 ) : int
		{
			return a + b;
		}
	}
}

重点 :

package
{
	import com.model.UserModel;
	
	import flash.display.Sprite;
	import flash.utils.describeType;
	
	public class AonauflyTest extends Sprite
	{
		public function AonauflyTest()
		{
			var userData : UserModel = new UserModel();
			var xml:XML = describeType(userData);
			var propMap : Object = new Object();  
//			for(var i:int =0;i<xml.accessor.length();i++){  
//				trace("name  :"+xml.accessor[i].@name);//获取类的属性名  
//				trace("value  :  "+userData[xml.accessor[i].@name]);//获取类属性值  
//			}
			
			for each (var item :XML in xml.*) {
				
				var itemName : String = item.name().toString();
				
				switch(itemName) {
					
					case "variable":
						
						propMap["字段:" +item.@name.toString()] = item.@type.toString();
						
						break;
					
					case "accessor":
						
						var access : String = item.@access;
						
						if((access == "readwrite") || (access == "writeonly")) {
							
							propMap["属性:"+item.@name.toString()] = item.@type.toString();
							
						}
					break;
				}
				
			}
			
			for (var prop:String in propMap)
				
			{
				
				trace(prop, "-", propMap[prop]);
				
			}
			
			trace("========================================================");
			trace("xml  :   "+xml.toXMLString());//遍历转换xml格式的数据  
		}
	}
}

结果 :

属性:occupation - int

属性:id - int

属性:name - String

字段:_sex - int

========================================================

xml  :   <type name="com.model::UserModel" base="com.model::BaseModel" isDynamic="false" isFinal="true" isStatic="false">

  <extendsClass type="com.model::BaseModel"/>

  <extendsClass type="Object"/>

  <variable name="_sex" type="int">

    <metadata name="__go_to_definition_help">

      <arg key="pos" value="340"/>

    </metadata>

  </variable>

  <accessor name="name" access="readwrite" type="String" declaredBy="com.model::UserModel">

    <metadata name="__go_to_definition_help">

      <arg key="pos" value="273"/>

    </metadata>

    <metadata name="__go_to_definition_help">

      <arg key="pos" value="186"/>

    </metadata>

  </accessor>

  <accessor name="id" access="readwrite" type="int" declaredBy="com.model::BaseModel">

    <metadata name="__go_to_definition_help">

      <arg key="pos" value="146"/>

    </metadata>

    <metadata name="__go_to_definition_help">

      <arg key="pos" value="215"/>

    </metadata>

  </accessor>

  <accessor name="occupation" access="writeonly" type="int" declaredBy="com.model::UserModel">

    <metadata name="__go_to_definition_help">

      <arg key="pos" value="648"/>

    </metadata>

  </accessor>

  <method name="sum" declaredBy="com.model::UserModel" returnType="int">

    <parameter index="1" type="int" optional="false"/>

    <parameter index="2" type="int" optional="true"/>

    <metadata name="__go_to_definition_help">

      <arg key="pos" value="850"/>

    </metadata>

  </method>

  <method name="doSomething" declaredBy="com.model::UserModel" returnType="void">

    <metadata name="__go_to_definition_help">

      <arg key="pos" value="744"/>

    </metadata>

  </method>

  <metadata name="__go_to_ctor_definition_help">

    <arg key="pos" value="93"/>

  </metadata>

  <metadata name="__go_to_definition_help">

    <arg key="pos" value="42"/>

  </metadata>

</type>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • LearnPython - Zip格式文

    py3study
  • 33. Python redis的 h

    #name 对应的hash中设置一个键值对(不存在,则创建键值对;否则,修改键值对)

    py3study
  • http状态码

    1开头的http状态码 表示临时响应并需要请求者继续执行操作的状态代码。 100   (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一...

    py3study
  • [译] 在 Android P 中使用默认的 TLS 来保护你的用户

    Android 开发者
  • Facebook社交图谱搜索暂时只是逻辑正确产品

    罗超为腾讯科技Ping撰稿。2013年4月19日独家发布于腾讯科技首页。 两天前,Facebook首次对社交图谱搜索进行了小规模的广告测试。早些时间Facebo...

    罗超频道
  • ROS专题----机器人模型urdf简明笔记

    版权声明:本文为zhangrelay原创文章,有错请轻拍,转载请注明,谢谢... ht...

    zhangrelay
  • 实战|手把手教你用Python爬取存储数据,还能自动在Excel中可视化!

    大家好,在之前我们讲过如何用Python构建一个带有GUI的爬虫小程序,很多本文将迎合热点,延续上次的NBA爬虫GUI,探讨如何爬取虎扑NBA官网数据。 并且将...

    星星在线
  • 对于初学者,Linux的哪种桌面环境比较适用?

    对初学者来说,Linux桌面可能是他们遇到的第一个难题,无论是从Win还是OSX过来的人,刚开始的时候可能连桌面的概念都不知道。我接下来的分析建立在这样的基础之...

    wuweixiang
  • 通俗易懂的生产环境Web应用架构介绍

    看见一篇非常通俗易懂且适合新手阅读的Web应用架构文章,我将其手工翻译了出来,分享给大家。

    后端技术漫谈
  • 通俗易懂的生产环境Web应用架构介绍

    看见一篇非常通俗易懂且适合新手阅读的Web应用架构文章,我将其手工翻译了出来,分享给大家。

    Rude3Knife的公众号

扫码关注云+社区

领取腾讯云代金券