zoukankan      html  css  js  c++  java
  • 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 
    

      

     

  • 相关阅读:
    【css】用纯 CSS 判断鼠标进入的方向
    【window】系统禁止运行脚本
    【go】VSCode配置Go插件和debug设置
    【PHP】php之Trait详解
    【layui】laydata 自定义日期之外格式的处理办法
    【PHP】防止视频资源被下载的解决办法
    【Markdown】 编辑器Editor.md集成使用
    代码之间为什么要加空格?
    求求你,别问了,Java字符串是不可变的
    养生吧,程序员!
  • 原文地址:https://www.cnblogs.com/zhepama/p/3361028.html
Copyright © 2011-2022 走看看