我的编程空间,编程开发者的网络收藏夹
学习永远不晚

AS3反射

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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 );
		}
	}
}

得到的结果:

wKioL1lnPCzzdmh4AACy6W-9wbo340.png-wh_50

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 );
		}
	}
}

结果:

wKiom1lnQX_TU4OVAAC61Djl3mk324.png-wh_50

可见 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;
		}
	}
}

返回结果:

wKioL1loG8zDbS-VAACNn8qHecA692.png-wh_50

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;
		}
	}
}

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

wKioL1loHGPyzQY5AAC5ZuDvxGc057.png-wh_50


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

引文也有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;
		}
	}
}

结果:

wKiom1loHd-TUpDNAACczlw9lOU365.png-wh_50


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

wKioL1loHoHznqc0AADLXxan5ng689.png-wh_50


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


使用 :  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>


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

AS3反射

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

AS3反射

反射这玩意,在一些游戏的框架中的确有其优势,但是注意反射或多或少会影响性能的.在资源的获取上就 使用了反射 , 得到SWF中的美术的资源 如:public static function getClazz(className : Strin
2023-01-31

AS3 斜坡角度反弹【算法】

1.公式坐标旋转:x1 = Math.cos(angle) * x - Math.sin(angle) * y; y1 = Math.cos(angle) * y + Math.sin(angle) * x;反坐标旋转: x1 = Math
2023-01-31

Unity3d 射线反射

As any person that has already used Unity’s Ray class knows, there’s no support for reflection, which could be useful fo
2023-01-31

Python_反射

一.反射定义放射是指程序可以访问。检测和修改它本身状态或行为的一种能力(自省)。二.四个自省的函数Python中提供了以下四种自省的函数,使用于类和对象。1.hasattr函数--用于判断obj中有没有name字符串对应的方法或属性,若有返
2023-01-31
2023-09-02

python 反射

1.反射主要是用到了4个函数(  用的最多的就是getattr()和 hasattr()  ):getattr()   从xxx对象中获取到xxx属性值hasattr()  判断xxx对象中是否有xxx属性值delattr()   从xxx
2023-01-30

Python-----反射

class Person(object): """定义一个人类""" def __init__(self, name): self.name = name def eat(self, food):
2023-01-31

Python27 反射

反射:通过字符串映射或修改程序运行时的状态、属性、方法, 有以下4个方法1.getattr:2.hasattr:判断一个对象里是否有对应(相同名称)字符串的方法3.setattr4.delattrclass Dog(object):
2023-01-31

Python反射

反射的定义根据字符串的形式去某个对象中操作成员根据字符串的形式去一个对象中寻找成员根据字符串的形式去一个对象中设置成员根据字符串的形式去一个对象中删除成员根据字符串的形式去一个对象中判断成员是否存在初始反射通过字符串的形式,导入模块根据用户
2023-01-31

[AS3]AS3 hack site

as3swf as3swf is a low level Actionscript 3 library to parse, create, modify and publish SWF files. Alpha version, under
2023-01-31

C#反射的入门之C#反射实例

C#反射的入门学习首先要明白C#反射提供了封装程序集、模块和类型的对象等等。那么这样可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属性,可以利用反射对它们进行访问。
C#反射模块2024-12-03

Python 反射-isinstance

用到的isinstance(对象,类)  -------------------  判断一个对象是否是一个类的实例issubclass(子类,父类)  ----------------  判断一个类是否是一个类的子类hasattr(对象,字
2023-01-30

python之反射

1. isinstance, type, issubclass的区别class Animal: def eat(self): print("刚睡醒吃点儿东西")class Cat(Animal): def play
2023-01-30

Java反射进阶—聊聊反射的几个问题

昨天有朋友反映好多反射知识没说到,所以今天算是补充篇,一起看看反射的进阶知识点。

AJPFX反射及反射的应用该如何理解

本篇文章为大家展示了AJPFX反射及反射的应用该如何理解,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。怎么理解反射,反射的应用 反射就是把Java类中的各种成分映射成相应的Java类。
2023-06-02

php有反射吗

这篇文章主要讲解了“php有反射吗”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php有反射吗”吧!php有反射,php具有完整的反射API,增加了内省类、接口、函数、方法和扩展的能力; 此
2023-06-22

java反射应用

反射使用JAVA反应进行两个vo有相同字段名字进行子转换:@Test public void doTransTest() { A a= new A(); A.setC(111L); B b= new B();
java反射应用
2017-08-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录