- 浏览: 333392 次
- 性别:
- 来自: 温州
文章分类
最新评论
-
helloworldlove:
Axis_UNZIP_PATH\Axis-version\we ...
3步把您的java程序转换为webservice -
hcqenjoy:
这个工具能再提供下吗 已经没办法下载了 谢谢
汉化 Flex Builder 3 帮助文档 -
NASa_CJ:
String source = HttpClientExamp ...
利用HttpClient获取网页内容 -
zlsj80:
下载地址无效了,楼主修正一下吧
汉化 Flex Builder 3 帮助文档 -
fykyx521:
下载地址都不能用了,是不过时了
汉化 Flex Builder 3 帮助文档
什么是反射
反射 (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
...{
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
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 中, 就得通过反射来解决这个问题了. 方法会在文后介绍
动态创建实例
* 这部分内容帮助中已经有例子, 我摘要一些翻译一下, 不过我的 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:
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);
}
}
}
动态获取类名称, 超类 (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() 函数时返回的是基于超类以的类继承结构. 而 getQualifiedSuperclassName() 将忽略类的继承结构直接返回最接近的继承对象
例如, 理论上 String 类继承自 Class, 但调用 getQualifiedSuperclassName(String) 时返回的是 Object. 换句话说, 不管你传递的是类还是类的实例, 他们的返回值都是一样的
参数 value:* - 任何值.
返回 String - 基类的完全限定名, 如果没有的话返回 null
------------------------------------------------------------
例子:
实例化新的 Sprite, 然后获取他的类名并输出
var sprite1:Sprite = new Sprite();
var classNameOfSprite:String = getQualifiedClassName(Sprite);
trace("Sprite 的类名 : " + classNameOfSprite); // Sprite 的类名 : flash.display::Sprite
超类
var superclassNameOfSprite:String = getQualifiedSuperclassName(Sprite);
trace("Sprite 的超类 (基类) 类名 : " + superclassNameOfSprite); // Sprite 的超类 (基类) 类名 : flash.display::DisplayObjectContainer
根据刚刚获取的类名使用 创建实例
var SpriteClass:Class = getDefinitionByName(classNameOfSprite) as Class;
var sprite2:Sprite = new SpriteClass() as Sprite;
trace("sprite2 通过 getDefinitionByName 创建 Sprite 实例");
画一个 100 x 100 的矩形并显示
sprite2.graphics.beginFill(0xFF00FF);
sprite2.graphics.drawRect(0, 0, 100, 100);
sprite2.graphics.endFill();
addChild(sprite2);
修改后的 ReflectionSample.as
import flash.display.Sprite;
import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;
import flash.utils.getQualifiedSuperclassName;
public class ReflectionSample extends Sprite
...{
public function ReflectionSample () ...{
getClassNameSample();
}
/** *//**
* 使用 flash.utils.getQualifiedClassName 和 getQualifiedSuperclassName 获取类名称, 并动态创建该类
*
*/
private function getClassNameSample ():void ...{
var sprite1:Sprite = new Sprite();
var classNameOfSprite:String = getQualifiedClassName(Sprite);
trace("Sprite 的类名 : " + classNameOfSprite);
var superclassNameOfSprite:String = getQualifiedSuperclassName(Sprite);
trace("Sprite 的超类 (基类) 类名 : " + superclassNameOfSprite);
var SpriteClass:Class = getDefinitionByName(classNameOfSprite) as Class;
var sprite2:Sprite = new SpriteClass() as Sprite;
trace("sprite2 通过 getDefinitionByName 创建 Sprite 实例");
sprite2.graphics.beginFill(0xFF00FF);
sprite2.graphics.drawRect(0, 0, 100, 100);
sprite2.graphics.endFill();
addChild(sprite2);
}
}
}
获取类信息
QUOTE:
------------------------------------------------------------
public function describeType(value:*):XML
生成一个 XML 对象来描述参数中指定的 ActionScript 对象, 这个方法使 ActionScript 实现了反射编程的概念.
如果参数 value 是某类的实例, 那么返回的 XML 对象包含了此类中所有的实例属性, 但是不会包含任何的静态属性.
这种情况下你可以通过检查标签 <type> 中的 isStatic 属性来判断他, 当参数为某类的实例时, 这个值为 false.
要获取类的静态属性, 可以通过传递类本身到参数 value, 这样返回的 XML 对象不仅包括了类的静态属性, 也包括所有的实例属性.
实例属性被包含在 <factory> 标签中使它们和静态属性区别开来. 在这种情况下, <type> 标签的 isStatic 属性为 true.
提示: 如果你只需要获取对象的继承结构而不需要 describeType() 提供的其他信息, 可以使用 getQualifiedClassName() 和 getQualifiedSuperclassName() 来替代
下表描述了 describeType() 生成的 XML 的标签和属性 (按运行代码察看)<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style type="text/css">...
* {...}{ font- size : 1em; }
table, td, th {...}{ font-family : Verdana; border : 1px solid #000; border-collapse : collapse; background-color : #fefefe}
th {...}{ background-color : #ccc; }
</style>
</head>
<body>
<table width="100%">
<
发表评论
-
使用 Macromedia Flex 开发 Web 服务客户端
2006-03-31 22:24 841引言 开放式标准被企业用作降低高整合及维护费用的主要手段。现实 ... -
Flex2 发现之旅:构建多语言本地化Flex应用
2006-04-14 14:30 1035创建过Java多语言本地化 ... -
自定义flex组件
2006-04-15 13:52 862我们在ActionScript里定义如下一个自定义MyButt ... -
构建富 Internet 应用程序
2006-07-18 18:09 1036... -
RIA framework - Cairngorm 2 淺析
2006-07-31 12:46 981隨者 Itereation::Two被併入 Adobe 成為 ... -
使用OPENAMF讓JAVA跟FLASH做溝通(Flash Remoting範例)
2006-12-27 14:18 1083這個範例使用 OpenAmf 1.0 openamf-1.0R ... -
OpenAMF 配置文件 详解
2006-12-30 22:56 998OpenAMF openamf-config.xml 配 ... -
关于flash.net.Socket的例子
2006-12-30 23:05 1453前两天看到http://www.ifbin ... -
OpenAMF - 自訂類別轉換對照
2006-12-30 23:08 750要看這篇文章,先要對Remoting有些概念 Remoting ... -
ActionScript 3 Cookbook 简体中文版 (已公布)
2007-01-17 00:05 1104ActionScript 3 Cookbook 中文版 P ... -
ActionScript 3 中的可变长数组
2007-08-24 14:33 904有时候我们可能不能确定数组的长度,在Actio ... -
Flex程序的全屏幕显示
2007-08-24 21:23 2741看到官方的一片讲解如何在Flash Player 9下全屏幕 ... -
ActionScript 3 中的嵌入方法
2007-08-24 21:56 791ActionScript 3也有嵌入式方法,应该说是嵌入函数, ... -
ActionScript 3 的多态性
2007-08-24 23:38 1286测试一下AS3的多态性,准备四个类:MyShape,MyCir ... -
ActionScript 3 中的对象序列化
2007-08-26 23:18 2143我们都知道对象序列化的目的是为了对象能够在网络上传输, ... -
让Flex程序全屏幕运行
2007-08-30 16:03 1619例子代码如下: <?xml version=&qu ... -
ActionScript 3 中的强制类型转换
2007-09-02 13:26 3136作者:Dreamer 日期:2007-07-2 ... -
AIR应用开发中文指南(BETA2)
2007-09-02 15:40 1448AIR应用开发中文指南(BETA2) 如转载,请注明: 译者 ... -
ActionScript3 制作倒影
2007-09-02 19:21 1101倒影类: package com.flashdev.bi ... -
Flex上传组件
2007-09-02 19:36 1816FileUpload.mxml <?xml ver ...
相关推荐
3. **相机**:PV3D提供了Camera类,允许开发者控制观察3D场景的角度和位置,实现视角的移动和缩放。 4. **光照**:光源是3D环境中不可或缺的一部分,PV3D可能包含多种光源类型,如点光源、平行光或聚光灯,以及相关...
4. **as3commons-lang.swc**:这是AS3 Commons库的一部分,提供了一些ActionScript 3标准库中没有的实用工具类,包括字符串处理、集合操作、反射等功能,增强了ActionScript的实用性。 5. **as3commons-reflect.swc...
1. **Class 类**:`flash.utils.getDefinitionByName()` 方法是AS3中获取类信息的关键。它接受一个字符串参数,该参数是类的完全限定名(例如,“package.ClassName”),然后返回对应的Class对象。这个Class对象...
在AS3中,XML是一种常见的数据交换格式,XML转换类可以帮助解析XML文档,并根据其结构创建相应的AS3对象。这个过程通常涉及到递归遍历XML节点,为每个节点创建对应的属性或子对象,对于XML属性则映射到对象的属性值...
在本篇中,我们将深入探讨 Away3D 学习的第二部分,主要关注场景中的SkyBox(天空盒)和反射效果。Away3D 是一款基于 ActionScript 的高性能三维引擎,常用于开发 Flash 平台上的交互式3D应用。通过 SkyBox 和反射,...
- **定义与历史**:ActionScript是一种面向对象的脚本语言,主要用于增强Adobe Flash Player和Adobe AIR中的交互性和功能。它最初由Macromedia公司开发,后被Adobe公司收购。ActionScript经历了三个主要版本的发展:...
它可能是基于某种特定的文件格式,如OBJ、3DS或XML,将这些数据转化为ActionScript3.0可以理解和处理的对象。理解这个类的工作原理对于导入和渲染外部3D模型至关重要。 接着,`Transform3D.as`类涉及到3D对象的变换...
在AS3.0版本中,引入了反射机制,这是一个强大的工具,允许程序在运行时检查自身并操作其内部结构,如类、属性、方法等。本压缩包文件"flash反射实例"提供了关于AS3.0反射机制的实际应用示例,对于想要深入了解和...
ActionScript3.0下第三方的反射库
Flex反射是Adobe Flex框架中的一个重要特性,它允许在运行时检查和操作类、对象、方法、属性等元数据。在Flex编程中,反射提供了一种动态访问和操作应用程序组件的能力,即使在编译时未知其具体类型的情况下也可以...
反射库专门用于生产环境,目前正在生产环境中使用。 入门 下载,或在您的项目中克隆仓库和参考。 外部依赖 没有任何 blooddy-crypto与nexuslib.swc静态链接 API文件 组件 枚举和枚举集 由于AS3不提供本机枚举结构,...
本压缩包“条件反射flash含源文件”就是一个这样的实例,专注于解释和展示生物心理学中的一个重要概念——条件反射。 条件反射是俄国生理学家伊万·巴甫洛夫的理论基础之一,它描述了在特定刺激与反应之间建立的...
首先,我们要理解在AS3中,`getDefinitionByName()`函数是实现反射的关键。这个函数接受一个字符串参数,该参数是类的全名(包括包名),并返回对应的Class对象。如果我们有一个类名为`Mc1`的元件,我们可以通过以下...
通过解析 Java 源代码,它能够生成相应的 AS3 类,使得开发者可以在 ActionScript 环境中使用 Java 类的功能。J2AS3_v4.air 文件可能就是这个工具的安装包或执行文件,用户需要先安装或运行这个文件来使用工具。 2....
在Java开发中,反射机制是一种非常强大的技术,它能够动态地获取类的信息并操作对象。而在Flex领域中,为了达到相似的效果,开发者们通常会借助于开源组件As2Commons来实现这种灵活性。本文将详细介绍如何使用As2...
在本文中,我们将深入探讨Papervision3D的类层次结构,以及如何利用这些类来创建复杂的3D场景。 首先,Papervision3D的核心组件包括Scene、Camera、Lights和Objects。Scene类是3D世界的基础,它包含所有可视对象、...
标题中的“3D立体展示图片-附as3源码”表明这是一个使用...这个3D立体展示图片项目是一个很好的学习资源,可以帮助开发者深入了解AS3中的3D图形编程,同时也可以作为一个起点,探索更复杂的3D应用程序的开发。
在IT行业中,Adobe Flex是一种基于ActionScript和MXML的开源框架,主要用于构建富互联网应用程序(RIA)。它允许开发者创建交互式、高性能的2D和3D图形应用,而无需深入理解底层图形编程的复杂性。在给定的“用于...
3. **3D对象和转换**:在Flex中,我们使用诸如Cube3D、Sphere3D等类来创建3D形状。通过设置Transform3D对象,可以对3D对象进行旋转、缩放和平移等操作,从而实现隧道效果的动态变化。 4. **动画和时间线**:为了...