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

  

 

as 中的反射的更多相关文章

  1. 详解C#中的反射

    反射(Reflection) 2008年01月02日 星期三 11:21 两个现实中的例子:1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况.这是如何做到的呢?B超是B ...

  2. python中的反射

    在绝大多数语言中,都有反射机制的存在.从作用上来讲,反射是为了增加程序的动态描述能力.通俗一些,就是可以让用户参与代码执行的决定权.在程序编写的时候,我们会写很多类,类中又有自己的函数,对象等等.这些 ...

  3. .net中的反射(转载)

    原文地址:http://www.cnblogs.com/Stephenchao/p/4481995.html 两个现实中的例子:1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的 ...

  4. [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦

    [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...

  5. Java中的反射和注解

    前言 在Java中,反射机制和注解机制一直是一个很重要的概念,那么他们其中的原理是怎么样呢,我们不仅仅需要会使用,更要知其然而之所以然. 目录 反射机制 反射如何使用 注解定义 注解机制原理 注解如何 ...

  6. .Net 中的反射(序章) - Part.1

    引言 反射是.Net提供给我们的一件强力武器,尽管大多数情况下我们不常用到反射,尽管我们可能也不需要精通它,但对反射的使用作以初步了解在日后的开发中或许会有所帮助. 反射是一个庞大的话题,牵扯到的知识 ...

  7. java中的反射机制在Android开发中的用处

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...

  8. Go 中的反射要点

    简介 反射是元数据编程的一种形式,指的是程序获得本身结构的一种能力.不同语言的反射模型实现不一样,本文中的反射,仅仅指的是Go语言中的反射模型. 类型以及接口 这个基本概念需要清晰,这里不详细展开. ...

  9. 【转】详解C#中的反射

    原帖链接点这里:详解C#中的反射   反射(Reflection) 2008年01月02日 星期三 11:21 两个现实中的例子: 1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内 ...

  10. 浅说Java中的反射机制(二)

    写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...

随机推荐

  1. 叉积判断 POJ1696

    // 叉积判断 POJ1696 #include <iostream> #include <algorithm> #include <cstring> #inclu ...

  2. win7旗舰版通知windows不是正版副本解决方法

    原文转载http://www.cnblogs.com/simple_666/archive/2013/04/13/win7%E6%97%97%E8%88%B0%E7%89%88%E9%80%9A%E7 ...

  3. Tkinter教程之Label篇

    本文转载自:http://blog.csdn.net/jcodeer/article/details/1811293 #Tkinter教程之Label篇'''1.Label的第一个例子text属性使用 ...

  4. POJ-1002 解题报告

      1.题目描述 http://poj.org/problem?id=1002 2.解题过程 按部就班来解题的话,这个题目很容易写出来,这是我的第一个版本的代码,思路是读入一行电话字符串,均转化为整型 ...

  5. 常用抓包指令for wireshark or tcpdump

    1, tshark -ni eth0 -R "tcp.dstport eq 8080" [wireshark 抓指定协议端口数据包] 2, tcpdump  -XvvennSs 0 ...

  6. Apache Spark GraphX的使用简介

    类似 Spark 在 RDD 上提供了一组基本操作符(如 map, f ilter, reduce), GraphX 同样也有针对 Graph 的基本操作符,用户可以在这些操作符传入自定义函数和通过修 ...

  7. YII开发技巧分享——模型(models)中rules自定义验证规则

    YII的models中的rules部分是一些表单的验证规则,对于表单验证十分有用,在相应的视图(views)里面添加了表单,在表单被提交之前程序都会自动先来这里面的规则里验证,只有通过对其有效的限制规 ...

  8. red5下nginx安装配置

    http://zfl110.iteye.com/blog/1155149 原址:http://lqw.iteye.com/blog/652763 安装Nginx 1.首先安装pcre-8.02.tar ...

  9. (转)UML常用图的几种关系的总结

    在UML的类图中,常见的有以下几种关系: 泛化(Generalization),  实现(Realization), 关联(Association), 聚合(Aggregation), 组合(Comp ...

  10. thymeleaf比较符号问题

    比较器与平等: 值表达可以是>.<.> =.< =符号,像往常一样,也是= =和!=操作符可以用来检查平等,但是>.<.> =.< =不能用,要用gt ...