(转)AS反射应用
总结下as3反射的相关用法,主要是四个函数:
flash.system.ApplicationDomain.getDefinition(linkName:String):Class; //flashcs元件库中的某个元件链接名称
flash.utils.getDefinitionByName(name:String):Object; //返回name参数指定的类的类对象引用
flash.utils.getQualifiedClassName(value:*):String; //返回对象的完全限定类名
flash.utils.getQualifiedSuperClassNameTest; // 返回value参数指定的对象的基类的完全限定类名。
在as3.0中,你会发现在flash.utils包中有一系列函数提供了反射的功能。主要包含以下功能:
* 确定对象的类
* 确定接口声明的常数和方法
* 获取类的成员、构造函数、方法、父类信息
* 在运行时根据类名创建类的实例
* 在运行时根据成员名称来调用对象成员
* 在运行时根据方法名称来调用对象方法
看代码:
Main.as类
- package
- {
- import flash.display.MovieClip;
- import flash.display.Shape;
- import flash.display.Sprite;
- import flash.system.ApplicationDomain;
- import flash.utils.getDefinitionByName;
- import flash.utils.getQualifiedClassName;
- import flash.utils.getQualifiedSuperclassName;
- import test.IPerson;
- import test.PersonImplA;
- /**
- * as3反射实例
- * @author xuechong
- * @language as3 fp9
- * @date 2012.06.03
- * @QQ群交流 241294271
- * */
- public class Main extends Sprite
- {
- //private var _personAersonImplA;
- public function Main()
- {
- //getDefinitionFunc();
- getDefinitionByNameFunc();
- //getQualifiedClassNameFunc();
- //getQualifiedSuperClassNameFunc();
- }
- /**
- * flash.system.ApplicationDomain类中的一个函数
- * aa字符串就是flashcs元件库中的链接名称(也就是元件绑定的类的名字)
- */
- public function getDefinitionFunc():void
- {
- var app:ApplicationDomain = ApplicationDomain.currentDomain;
- try
- {
- var cls:Class = app.getDefinition("aa") as Class;
- var mc:MovieClip = new cls() as MovieClip;
- mc.y = 300;
- this.addChild(mc);
- }
- catch(error:ReferenceError)
- {
- trace("反射错误", error.message);
- }
- }
- /**
- * flash.utils.getDefinitionByName(name:String):Object
- * 返回name参数指定的类的类对象引用
- * 注:如果是自定义类则要先定义上此类的引用
- * */
- public function getDefinitionByNameFunc():void
- {
- var ClassReference:Class = getDefinitionByName("test.PersonImplA") as Class; //[class PersonImplA]
- var obj:IPerson = new ClassReference() as IPerson; //[object PersonImplA]
- obj.sayHello();
- }
- /**
- * flash.utils.getQualifiedClassName(value:*):String
- * 返回对象的完全限定类名
- * */
- private function getQualifiedClassNameFunc():void
- {
- var sh:Shape = new Shape();
- trace(getQualifiedClassName(sh)); //flash.display::Shape
- var aersonImplA = new PersonImplA();
- trace(getQualifiedClassName(a)); //test:ersonImplA
- trace(getQualifiedClassName(this)); //Main
- }
- /**
- * flash.utils.getQualifiedSuperClassNameTest
- * 返回value参数指定的对象的基类的完全限定类名。
- * 即返回继承关系上的父类
- * */
- private function getQualifiedSuperClassNameFunc():void
- {
- var sh:Shape = new Shape();
- trace(getQualifiedSuperclassName(sh)); //flash.display:isplayObject
- var aersonImplA = new PersonImplA();
- trace(getQualifiedSuperclassName(a)); //flash.display::Sprite
- trace(getQualifiedSuperclassName(this)); //flash.display::Sprite
- }
- }
- }
IPerson.as接口
- package test
- {
- public interface IPerson
- {
- function sayHello():void;
- }
- }
PersonImplA.as类
- package test
- {
- import flash.display.Sprite;
- public class PersonImplA extends Sprite implements IPerson
- {
- public function PersonImplA()
- {
- }
- public function sayHello():void
- {
- trace("This is PersonImplA");
- }
- }
- }
PersonImplB.as类
- package test
- {
- import flash.display.Sprite;
- public class PersonImplB extends Sprite implements IPerson
- {
- public function PersonImplB()
- {
- }
- public function sayHello():void
- {
- trace("This is PersonImplB");
- }
- }
- }