[转]FLEX2/ACTIONSCRIPT3 的反射
程序员文章站
2022-07-12 15:35:59
...
在ActionScript 3中,你会发现在flash.utils包中有一系列函数提供了反射的功能。主要包含以下功能:
* 确定对象的类
* 获取类的成员、方法、构造函数、父类的信息
* 确定接口声明的常数和方法
* 在运行时根据类名创建类的实例
* 在运行时根据成员名称获取或者设置对象成员的值
* 在运行时根据方法名称,调用对象的方法
你可以使用类似于"describeType"之类的功能,它返回一个Xml对象。举一个例子:
如果你想进一步,根据类名创建对象的实例,我们可以使用"getDefinitionByName()"
尽管这是一些非常方便的方法,但是在FlashPlayer中使用反射还是会有许多的限制,因为缺乏运行时的动态源码编译。上面的功能对于那些在内建的类,比如:Sprite类来说无疑是有用的,但是对于自定义类来说,我们会遇到很多麻烦。比如:
尽管我们使用了import语句,但是"getDefinitionByName()"还是会失败。原因上面已经说过了,在运行时编译源代码是不允许的。也许以后可以。在目前情况下,要实现上述功能,至少要在代码中初始化一个类的实例。也就是声明一个类的实例:
* 确定对象的类
* 获取类的成员、方法、构造函数、父类的信息
* 确定接口声明的常数和方法
* 在运行时根据类名创建类的实例
* 在运行时根据成员名称获取或者设置对象成员的值
* 在运行时根据方法名称,调用对象的方法
你可以使用类似于"describeType"之类的功能,它返回一个Xml对象。举一个例子:
package { import flash.display.Sprite; import flash.utils.describeType; public class DescribeTypeExample extends Sprite { public function DescribeTypeExample() { var child:Sprite = new Sprite(); var description:XML = describeType(child); trace(description..accessor.@name.toXMLString()); } } }
如果你想进一步,根据类名创建对象的实例,我们可以使用"getDefinitionByName()"
package { import flash.display.DisplayObject; import flash.display.Sprite; import flash.utils.getDefinitionByName; public class GetDefinitionByNameExample extends Sprite { private var bgColor:uint = 0xFFCC00; private var size:uint = 80; public function GetDefinitionByNameExample() { var ClassReference:Class = getDefinitionByName(“flash.display.Sprite”) as Class; var instance:Object = new ClassReference(); instance.graphics.beginFill(bgColor); instance.graphics.drawRect(0, 0, size, size); instance.graphics.endFill(); addChild(DisplayObject(instance)); } } }
尽管这是一些非常方便的方法,但是在FlashPlayer中使用反射还是会有许多的限制,因为缺乏运行时的动态源码编译。上面的功能对于那些在内建的类,比如:Sprite类来说无疑是有用的,但是对于自定义类来说,我们会遇到很多麻烦。比如:
package { import com.customtypes.string; // Custom String Implementation Class import flash.utils.getDefinitionByName; public class GetDefinitionByNameExample { public function GetDefinitionByNameExample() { var ClassReference:Class = getDefinitionByName(“com.customtypes.string”) as Class; var instance:Object = new ClassReference(); instance.customParameter = “my parameter”; } } }
尽管我们使用了import语句,但是"getDefinitionByName()"还是会失败。原因上面已经说过了,在运行时编译源代码是不允许的。也许以后可以。在目前情况下,要实现上述功能,至少要在代码中初始化一个类的实例。也就是声明一个类的实例:
var customType : com.customtypes.string;
上一篇: JasperReport用户手册
下一篇: Actionscript3 Timer类