论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > Flash AS教程
Tag:2.0,3.0菜鸟,游戏,,cs,技巧,源码,,文本,文字,函数,音乐,随机,拖拽,asp,access,xml,mc,视频教程

Flash AS教程_Reflection的反射教程

文章类别:Flash AS | 发表日期:2010-3-29 10:51:40

21视频教程网3月28日整理

什么是反射
反射 (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

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;
  }
  
 }
}

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 模式. 控制台中只会出现

引用:
测试 for..in 循环, 遍历 Dummy 的实例

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

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



动态创建实例
* 这部分内容帮助中已经有例子, 我摘要一些翻译一下, 不过我的 e 文很烂. 希望大家能看得懂.

as3 使用 flash.util.getDefinitionByName 动态获取类 (Class) 引用
帮助中该方法的描述 :

引用:
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
package {
 import flash.display.Sprite;
 import flash.utils.getDefinitionByName;
 import flash.text.TextField;
 public class ReflectionSample extends Sprite
 {
  public function ReflectionSample () {
   getDefinitionByNameSample();
  }
  
  /**
   * 使用 flash.utils.getDefinitionByName 动态获取类 (Class) 并创建实例
   *
   */
  private function getDefinitionByNameSample ():void {
   var ClassReference:Class = getDefinitionByName("flash.text.TextField") as Class;
   var instance:TextField = new ClassReference() as TextField;
   instance.autoSize = "left";
   instance.text = "我通过 getDefinitionByName 动态创建";
   addChild(instance);
  }
 }
}

Flash AS教程

视频教程列表
文章教程搜索
 
Flash AS推荐教程
Flash AS热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058