as 中的反射
flash.utils包中的getDefinitionByName,getQualifiedClassName,getQualifiedSuperclassName..可以当做反射用.
1、getDefinitionByName
如果你已知这个类的类名类路径,但是你又没办法得到这个类的原型,那么可以通过该函数,将已知的类名类路径转换为类的原型,然后还可以将得到的类原型进行实例化,比如:
var Tmp = getDefinitionByName("flash.display.Sprite"); var spr = new Tmp; trace(spr is Sprite); //输出 true
通过getDefinitionByName得来的其实就是Sprite类,然后实例化,再判断spr是否为Sprite,得出的结果是true
注意:
1. 使用getDefinitionByName方法获得的类必须是在发布的时候被编译到swf文中的,否则就会报错:"ReferenceError: Error #1065: 变量 <类的名字> 未定义。"
2. 由于使用import导入的类(只是作为查找类的路径)并不会在发布swf的时候被编译进去(当然flash.*包里面的类本身就是player中的),只用在代码中使用到的类才会被编译进去...
import 指令仅导入类、函数和位于导入包顶级的变量。必须显式导入嵌套包。
如果导入一个类,但没有在脚本中使用该类,则该类不作为 SWF 文件的一部分导出。这意味着您导入大型包时可以不必担心 SWF 文件的大小;只有在实际使用某一类的情况下,才会在 SWF 文件中包括与该类关联的字节码。导入类的一个缺点是将增加名称冲突的可能性。
那么,要使用这个方法来实现动态执行怎么办?
只有把可能需要的所有类包含在代码中(比如在定义变量的类型声名时使用 *),并且在开始声名此类,声名时可以随便使用个名字,这样才能使用getDefinitionByName方法...
实际上getDefinitionByName所获得的类名就是前面你所做的声名的名字引用
import com.ooph.parser.*; //包内有ParserWeb类 var ss:ParserWeb; //在此处声名ParserWeb类,名为ss(名字不用与下面实例名的相同) var sortStr:String="Web"; //注意这里要写完整的类路径 "com.ooph.parser.Parser"+sortStr var P:Class = getDefinitionByName("com.ooph.parser.Parser"+sortStr) as Class; var newParser:* = new P();
getDefinitionByName的用处是可以通过字符串映射的取到相应的类。
但是如果你在一个类中,embed一个图片,将这个图片声明为一个class 。这样用getDefinitionByName来调用,就会出现“未定义错误”。
package { import flash.display.Bitmap; import flash.display.MovieClip; import flash.utils.getDefinitionByName; /** * ... * @author FireYang */ public class embedTest extends MovieClip { [Embed(source="tile1.png")] private var tile1:Class; public function embedTest() { var string:String = "embedTest_tile1";//所在类名+"_"+embed的类名 var c:Class = getDefinitionByName(string) as Class; var b:Bitmap = new c(); b.x = 100; b.y = 100; trace(b); addChild(b); } } }
2、getQualifiedClassName
如果你现在有个引用值,你不知道这个引用所表示的什么类,什么类路径,或许是个类不知道类名等等,想得到这个类的完整名字,那么可以使用它,比如:
var spr:Sprite = new Sprite; trace(getQualifiedClassName(spr)); trace(getQualifiedClassName(Sprite)); //两者都是输出 flash.display::Sprite
3、getQualifiedSuperclassName
这个方法就比较好玩了,是获取自己父类的类原型,比如你一系列的类是继承某个抽象类,而现在你无法得到这个抽象类,那么你可以使用该方法获得该抽象类的类原型,比如:
var spr:Sprite = new Sprite; trace(getQualifiedSuperclassName(spr)); trace(getQualifiedSuperclassName(Sprite)); //两者都是输出 flash.display::DisplayObjectContainer