2008-01-28
[转]FLEX2/ACTIONSCRIPT3 的反射
关键字: actionscript3反射 反射机制
在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;
发表评论
- 浏览: 13748 次
- 性别:

- 来自: 福州

- 详细资料
搜索本博客
最新评论
-
[原]BIRT 2.2.2 运行时使 ...
这种方式是变相修改BIRT自带的JDBC ODA Driver实现,也许能工作, ...
-- by RogerTu -
BIRT Report Engine API
是个好文章,哈哈
-- by fy_kenny -
BIRT Report Engine API
官方网上的。
-- by 咖啡舞者 -
BIRT Report Engine API
原文出处?
-- by fangzhouxing -
请教:ORACLE中一条语句返 ...
明白了,用分析函数来做,如: select * from( select nam ...
-- by 咖啡舞者






评论排行榜