AS3.0中的反射

1、反射就是通过一个字符串得到一个Class然后根据这个Class得到实例。

 

2、例子:现在假设有100种动物(Animal),它们都继承自Animal类,这时候你需要实例化随机选择的一种动物,如果你不用反射,就要用switch做N次的条件判断,(Dictionary实现会比较优雅,但是依旧繁琐)。如果用反射,就会简单的多:

1 public static function getNewAnimal(type:String):Animal
2 {
3     var classReference:Class = getDefinitionByName(type) as Class; //通过一个字符串得到一个Class
4     var animal:Animal= new classReference() as Animal; //根据这个Class得到实例
5     return animal;
6 }

 

3、例子:两个不同SWF之间共享类或者资源。

1 var loadedSWF = evt.target; //载入的SWF
2 var domain: ApplicationDomain = loadedSWF.applicationDomain as ApplicationDomain;
3 var ClassReference:Class = domain.getDefinitionByName("temp") as Class;
4 //通过这种反射方式,就把loadedSWF中的temp类取出来用了。

 

4、http://www.cnblogs.com/HuntSoul/archive/2010/05/22/1741388.html

 

5、AS3.0中的反射分析

取类名: 传进一个object,返回类的全名:

1 var loader:URLLoader = new URLLoader( ); 
2 var className:String = getQualifiedClassName(loader); 
3 trace(className); // Displays flash.net.URLLoader 

取父类的类名:传进一个object,返回父类的类名:

1 var loader:URLLoader = new URLLoader( ); 
2 var className:String = getQualifiedSuperclassName(loader); 
3 trace(className); // Displays flash.events.EventDispatcher

根据类名取类:

1 var classReference:Class = Class(getDefinitionByName("flash.net.URLLoader")); 
2 var instance:Object = new classReference( ); 

getQualifiedClassName( ) 或 getQualifiedSuperclassName( ) 与 getDefinitionByName() 结合使用的例子:

1 var loader:URLLoader = new URLLoader( ); 
2 var className:String = getQualifiedClassName(loader); 
3 var classReference:Class = Class(getDefinitionByName(className)); 
4 var instance:Object = new classReference( ); 

Introspection:describeType( )返回对象的类型描述,例如: 

1 var loader:URLLoader = new URLLoader( ); 
2 var description:XML = describeType(loader); 
3 trace(description); 

输出如下: 

View Code
 <type name="flash.net::URLLoader" base="flash.events::EventDispatcher"
 isDynamic="false" isFinal="false" isStatic="false">
 <metadata name="Event">
 <arg key="name" value="httpStatus"/>
 <arg key="type" value="flash.events.HTTPStatusEvent"/>
 </metadata>
 <metadata name="Event">
 <arg key="name" value="securityError"/>
 <arg key="type" value="flash.events.SecurityErrorEvent"/>
 </metadata>
 <metadata name="Event">
 <arg key="name" value="ioError"/>
 <arg key="type" value="flash.events.IOErrorEvent"/>
 </metadata>
 <metadata name="Event">
 <arg key="name" value="progress"/>
 <arg key="type" value="flash.events.ProgressEvent"/>
 </metadata>
 <metadata name="Event">
 <arg key="name" value="complete"/>
 <arg key="type" value="flash.events.Event"/>
 </metadata>
 <metadata name="Event">
 <arg key="name" value="open"/>
 <arg key="type" value="flash.events.Event"/>
 </metadata>
 <extendsClass type="flash.events::EventDispatcher"/>
 <extendsClass type="Object"/>
 <implementsInterface type="flash.events::IEventDispatcher"/>
 <constructor>
 <parameter index="1" type="flash.net::URLRequest" optional="true"/>
 </constructor>
 <variable name="bytesTotal" type="uint"/>
 <variable name="data" type="*"/>
 <method name="load" declaredBy="flash.net::URLLoader" returnType="void">
 <parameter index="1" type="flash.net::URLRequest" optional="false"/>
 </method>
 <method name="close" declaredBy="flash.net::URLLoader" returnType="void"/>
 <variable name="dataFormat" type="String"/>
 <variable name="bytesLoaded" type="uint"/>
 <method name="dispatchEvent" declaredBy="flash.events::EventDispatcher"
 returnType="Boolean">
 <parameter index="1" type="flash.events::Event" optional="false"/>
 </method>
 <method name="toString" declaredBy="flash.events::EventDispatcher"
 returnType="String"/>

  

posted @   itank  阅读(564)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示