|
感谢草莓和 yhc13 提供人肉翻译机支持
什么是反射 反射 (Reflection) 是指在程序在运行时 (run-time) 获取类信息的方式. 诸如实现动态创建类实例, 方法等. 在很语言中都有相关的的实现, 如 Java 和 c# 等
反射有什么用 在 as3 与 as2 不同, 类实例中任何元素, 如变量 (variable), 访问器 (accessor, 即 getter / setter), 方法 (method) 都是不可被 for..in 遍历的 (不是默认哦, 目前我还没找到办法可以让他被遍历), 并且不管你是否继承自 Object (默认继承就是 Object, 不写也一样), 是否把类声明为 dynamic. 或许有人会问自然是 Object 的子类, 不是可以用 setPropertyIsEnumerable 来设置是否隐藏变量么. 很遗憾的是经过的我的尝试, 在类里使用 setPropertyIsEnumerable("属性名") 编译器报告方法可能未定义. 随后尝试 super.setPropertyIsEnumerable("属性名"), 编译通过但抛运行时错误, 同样是方法未定义 -_- 而其他方法诸如 propertyIsEnumerable("属性名") 却可以正常使用
新建一个 ActionScript 项目, 分别创建下面 2 个类:
Dummy.as
代码拷贝框
[Ctrl+A 全部选择 然后拷贝]
ReflectionSample.as
代码拷贝框
[Ctrl+A 全部选择 然后拷贝]
最后测试 ReflectionSample, 记得用 debug 模式. 控制台中只会出现:
QUOTE: ------------------------------------------------------------ 测试 for..in 循环, 遍历 Dummy 的实例 ------------------------------------------------------------
显然 dummy 中的元素都没有被遍历出.
在 as1, 2 中很简单就可以实现的问题在 as3 得换个办法了, 谁让他们是传统的脚本语言呢.而在 as3 中, 就得通过反射来解决这个问题了. 方法会在文后介绍
动态创建实例
* 这部分内容帮助中已经有例子, 我摘要一些翻译一下, 不过我的 e 文很烂. 希望大家能看得懂.
as3 使用 flash.util.getDefinitionByName 动态获取类 (Class) 引用 帮助中该方法的描述 :
QUOTE: ------------------------------------------------------------ public function getDefinitionByName(name:String):Object 返回参数 name 中指定的类引用
参数 name:String - 类名称 返回 Object - 返回参数 name 中指定的类引用 错误 ReferenceError - 找不到参数 name 对应的公共定义 ------------------------------------------------------------
使用方法如下:
获取类 flash.text.TextField 的引用. as 语句是无异常的类型转换. 如果转换失败那么目标变量将被设置成 null
var ClassReference:Class = getDefinitionByName("flash.text.TextField") as Class;
实例化所引用的类, 并设置一些属性
var instance:TextField = new ClassReference() as TextField; instance.autoSize = "left"; instance.text = "我通过 getDefinitionByName 动态创建";
最后添加到场景中并显示
addChild(instance);
修改后的 ReflectionSample.as:
代码拷贝框
[Ctrl+A 全部选择 然后拷贝]
动态获取类名称, 超类 (Superclass) 名称 有点像之前版本中的 typeof, 这个方法返回的是字符串
QUOTE: ------------------------------------------------------------ public function getQualifiedClassName(value:*):String 返回类的完全限定名 (fully qualified class name, qualified 我不知道怎么翻了..)
参数 value:* - 想要得到完全限定名的对象. 他可以是任何 ActionScript 类型, 对象实例, 简单类型如 uint 以及类类型. 返回 String - 包含类的完全限定名的字符串 ------------------------------------------------------------
QUOTE: ------------------------------------------------------------ public function getQualifiedSuperclassName(value:*):String 返回目标对象基类的完全限定名, 本函数提供比 describeType 更简便的方法来获取基类的名称 提示: 本函数限制只寻找实例的继承层次,而 describeType() 函数使用的是类对象继承. 调用 describeType() [1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页 |