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 

  

 

 

posted @ 2013-10-10 12:30  zhepama  阅读(458)  评论(0编辑  收藏  举报