功能测试
首页 > FLEX/AS3 > 正文

AS3中的反射作用

发布-flex技术 | 查看- | 发表时间-2011-5-15

什么是反射
反射 (Reflection) 是指在程序在运行时 (run-time) 获取类信息的方式. 诸如实现动态创建类实例, 方法等. 在很语言中都有相关的的实现, 如 Java 和 c# 等

AS3反射有什么用
在 as3 与 as2 不同, 类实例中任何元素, 如变量 (variable), 访问器 (accessor, 即 getter / setter), 方法 (method) 都是不可被 for..in 遍历的 (不是默认哦, 目前我还没找到办法可以让他被遍历),
并且不管你是否继承自 Object (默认继承就是 Object, 不写也一样), 是否把类声明为 dynamic.
或许有人会问自然是 Object 的子类, 不是可以用 setPropertyIsEnumerable 来设置是否隐藏变量么.
很遗憾的是经过的我的尝试, 在类里使用 setPropertyIsEnumerable("属性名") 编译器报告方法可能未定义.
随后尝试 super.setPropertyIsEnumerable("属性名"), 编译通过但抛运行时错误, 同样是方法未定义 -_-
而其他方法诸如 propertyIsEnumerable("属性名") 却可以正常使用

新建一个 ActionScript 项目, 分别创建下面 2 个类:

Dummy.as

拷贝下列代码

package
{
 public dynamic class Dummy extends Object
 {
  
  public var variable1:String;
  public function Dummy () {
   variable1 = "我是字符串";
   
   // 使用下面 2 个句子分别会报告编译时错误和运行时错误
   // setPropertyIsEnumerable("variable1");
   // super.setPropertyIsEnumerable("accessorOfVar1");
  }
 
  public function get accessorOfVar1 ():String {
   return "通过访问器访问, variable1 : " + variable1;
  }
  
 }
}
ReflectionSample.as

package {
 import flash.display.Sprite;


 public class ReflectionSample extends Sprite
 {
  public function ReflectionSample () {
   testPropsEnumeration();
  }
  
  
  
  /**
   * 测试 for..in 遍历
   *
   */
  private function testPropsEnumeration ():void {
   trace("测试 for..in 循环, 遍历 Dummy 的实例");
   var dummy:Dummy = new Dummy();
   
   for (var i:String in dummy)
    trace( i + " : " + dummy[i] );
  }
 }
}
最后测试 ReflectionSample, 记得用 debug 模式. 控制台中只会出现:

QUOTE:
------------------------------------------------------------
测试 for..in 循环, 遍历 Dummy 的实例
------------------------------------------------------------

显然 dummy 中的元素都没有被遍历出.

在 as1, 2 中很简单就可以实现的问题在 as3 得换个办法了, 谁让他们是传统的脚本语言呢.而在 as3 中, 就得通过反射来解决这个问题了. 方法会在文后介绍

flex技术 (www.flexjs.cn)

相关阅读

[用AS3编写一个loading条][Robotlegs AS3模型入门介绍] [AS3自定义命名空间和默认命名空间效率比较] [AS3中鼠标坐标与鼠标事件总结] [as3解决缩放影片]

或许你还对下面的文章感兴趣

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

培训推荐 北京flex as3培训
最新文章
123
456
最近评论
访客留言
赞助商链接FLEX基础 |FLEX培训|Entries RSSCopyright flex培训 www.flexjs.cn

京公网安备110114000966号 京ICP备11015828号-1 | DESIGN BY Seanloo.cn