2008
8-16
请尊重别人写的东西,如果想转载该文章请注明版权sunbright博客 http://www.xiaos8.com
上次已经讲过了getDefinitionByName,getQualifiedClassName,getQualifiedSuperclassName三个偏门函数
这次我们来讲另外一个偏门函数:describeType
首先我们来看看ADOBE的话看完后,大家比较关注的应该是反射编程是什么意思?其实看完反射编程的描述,然后切合ADOBE提供的函数,说实现了反射编程概念。。我始终没有联系起来两者的关系,但可以确定一点的是,通过这个函数的确可以让我们在写程序的时候,直接通过代码本身就去对类结构进行分析,来形成自我反射,但只是概念性的,因为该函数提供的功能还远远达不到这个级别,废话了这么基础知识,接下来讲讲怎么使用这个函数了
函数的作用呢,就是把一个类的各种情况,通过XML的形式展现出来,比如这个类是动态类,或者密封类,或者能否扩展,父类是谁,爷爷类是谁,甚至更高的前辈是谁,有多少公开方法,有多少公开属性,有多少静态属性等等,全部使用XML展示出来。。。听起来似乎很神奇,很悬,那么我们来看具体例子,会理解的更快一点。
其实你发现
<type name="flash.display::DisplayObject" base="Class" isDynamic="true" isFinal="true" isStatic="true">
这一段表示了这个类叫什么名字,路径是什么,是否是动态类,是否是不可扩展类等等
<method name="dispatchEvent" declaredBy="flash.events::EventDispatcher" returnType="Boolean">
<parameter index="1" type="flash.events::Event" optional="false"/>
</method>
这一段表示了这个类含有方法dispatchEvent,继承的flash.events::EventDispatcher,返回数据的类型为Boolean
他共有一个参数,参数类型是flash.events::Event,是必须的参数
<implementsInterface type="flash.events::IEventDispatcher"/>
<implementsInterface type="flash.display::IBitmapDrawable"/>
这两段表示了他实现了这两个接口
<extendsClass type="flash.events::EventDispatcher"/>
<extendsClass type="Object"/>
这两段表示了他继承了谁,他继承的类又继承了谁,直到Object始祖,才没有了。。
………………………………
后面就不列出来了,自己看这个把:明白了吗?帮助文档列出来的这些节点,也不是全部,还有个几个节点没有解释是什么意思。。。
<metadata name="Event">
<arg key="name" value="removedFromStage"/>
<arg key="type" value="flash.events.Event"/>
</metadata>
这个肯定是表明事件,但还有几个没有弄明白表示的什么,大家可以提提。。。
另外课题:
1、大家可以去用这个输出TextField看看,有几个方法,adobe并没有在帮助文档中公开,应该还有相当一部分的类有些公开的方法或属性都未公开
2、留个题目给大家,这也是腾讯曾经招flasher的一道面试题
评论Feed: http://www.xiaos8.com/feed.asp?q=comment&id=251
上次已经讲过了getDefinitionByName,getQualifiedClassName,getQualifiedSuperclassName三个偏门函数
这次我们来讲另外一个偏门函数:describeType
首先我们来看看ADOBE的话
下面引用帮助文档中的原话
生成描述 ActionScript 对象(命名为方法的参数)的 XML 对象。 此方法实现 ActionScript 语言的反射编程概念。
以下引用某一段教材
使用反射编程(reflective programming),可以使你的程序在运行时通过自省(introspection)运行需求,使用具体化(reification)能力自己调解(intercession)自己(通俗地说,就是运行时自动修改程序),动态获得新的行为能力。具有反射能力的语言或应用,能够把对程序部分功能的定义延缓到运行时确定,也就是让最终用户定制应用程序,这种特性使程序具有了某种生命,使程序的自我演化成为可能。
函数的作用呢,就是把一个类的各种情况,通过XML的形式展现出来,比如这个类是动态类,或者密封类,或者能否扩展,父类是谁,爷爷类是谁,甚至更高的前辈是谁,有多少公开方法,有多少公开属性,有多少静态属性等等,全部使用XML展示出来。。。听起来似乎很神奇,很悬,那么我们来看具体例子,会理解的更快一点。
trace(describeType(DisplayObject));
/*
输出:
<type name="flash.display::DisplayObject" base="Class" isDynamic="true" isFinal="true" isStatic="true">
<extendsClass type="Class"/>
<extendsClass type="Object"/>
<accessor name="prototype" access="readonly" type="*" declaredBy="Class"/>
<factory type="flash.display::DisplayObject">
<metadata name="Event">
<arg key="name" value="render"/>
<arg key="type" value="flash.events.Event"/>
</metadata>
<metadata name="Event">
<arg key="name" value="removedFromStage"/>
<arg key="type" value="flash.events.Event"/>
</metadata>
<metadata name="Event">
<arg key="name" value="removed"/>
<arg key="type" value="flash.events.Event"/>
</metadata>
<metadata name="Event">
<arg key="name" value="enterFrame"/>
<arg key="type" value="flash.events.Event"/>
</metadata>
<metadata name="Event">
<arg key="name" value="deactivate"/>
<arg key="type" value="flash.events.Event"/>
</metadata>
<metadata name="Event">
<arg key="name" value="addedToStage"/>
<arg key="type" value="flash.events.Event"/>
</metadata>
<metadata name="Event">
<arg key="name" value="added"/>
<arg key="type" value="flash.events.Event"/>
</metadata>
<metadata name="Event">
<arg key="name" value="activate"/>
<arg key="type" value="flash.events.Event"/>
</metadata>
<extendsClass type="flash.events::EventDispatcher"/>
<extendsClass type="Object"/>
<implementsInterface type="flash.events::IEventDispatcher"/>
<implementsInterface type="flash.display::IBitmapDrawable"/>
<accessor name="x" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="y" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="blendMode" access="readwrite" type="String" declaredBy="flash.display::DisplayObject"/>
<accessor name="scale9Grid" access="readwrite" type="flash.geom::Rectangle" declaredBy="flash.display::DisplayObject"/>
<accessor name="alpha" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="name" access="readwrite" type="String" declaredBy="flash.display::DisplayObject"/>
<accessor name="rotation" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="scrollRect" access="readwrite" type="flash.geom::Rectangle" declaredBy="flash.display::DisplayObject"/>
<accessor name="cacheAsBitmap" access="readwrite" type="Boolean" declaredBy="flash.display::DisplayObject"/>
<accessor name="accessibilityProperties" access="readwrite" type="flash.accessibility::AccessibilityProperties" declaredBy="flash.display::DisplayObject"/>
<method name="globalToLocal" declaredBy="flash.display::DisplayObject" returnType="flash.geom::Point">
<parameter index="1" type="flash.geom::Point" optional="false"/>
</method>
<accessor name="scaleX" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="visible" access="readwrite" type="Boolean" declaredBy="flash.display::DisplayObject"/>
<method name="getBounds" declaredBy="flash.display::DisplayObject" returnType="flash.geom::Rectangle">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
</method>
<accessor name="width" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="opaqueBackground" access="readwrite" type="Object" declaredBy="flash.display::DisplayObject"/>
<method name="hitTestPoint" declaredBy="flash.display::DisplayObject" returnType="Boolean">
<parameter index="1" type="Number" optional="false"/>
<parameter index="2" type="Number" optional="false"/>
<parameter index="3" type="Boolean" optional="true"/>
</method>
<accessor name="height" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="scaleY" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="mouseX" access="readonly" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="mask" access="readwrite" type="flash.display::DisplayObject" declaredBy="flash.display::DisplayObject"/>
<accessor name="parent" access="readonly" type="flash.display::DisplayObjectContainer" declaredBy="flash.display::DisplayObject"/>
<method name="getRect" declaredBy="flash.display::DisplayObject" returnType="flash.geom::Rectangle">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
</method>
<accessor name="mouseY" access="readonly" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="loaderInfo" access="readonly" type="flash.display::LoaderInfo" declaredBy="flash.display::DisplayObject"/>
<accessor name="transform" access="readwrite" type="flash.geom::Transform" declaredBy="flash.display::DisplayObject"/>
<accessor name="root" access="readonly" type="flash.display::DisplayObject" declaredBy="flash.display::DisplayObject"/>
<accessor name="stage" access="readonly" type="flash.display::Stage" declaredBy="flash.display::DisplayObject"/>
<method name="hitTestObject" declaredBy="flash.display::DisplayObject" returnType="Boolean">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
</method>
<method name="localToGlobal" declaredBy="flash.display::DisplayObject" returnType="flash.geom::Point">
<parameter index="1" type="flash.geom::Point" optional="false"/>
</method>
<accessor name="filters" access="readwrite" type="Array" declaredBy="flash.display::DisplayObject"/>
<method name="hasEventListener" declaredBy="flash.events::EventDispatcher" returnType="Boolean">
<parameter index="1" type="String" optional="false"/>
</method>
<method name="toString" declaredBy="flash.events::EventDispatcher" returnType="String"/>
<method name="willTrigger" declaredBy="flash.events::EventDispatcher" returnType="Boolean">
<parameter index="1" type="String" optional="false"/>
</method>
<method name="removeEventListener" declaredBy="flash.events::EventDispatcher" returnType="void">
<parameter index="1" type="String" optional="false"/>
<parameter index="2" type="Function" optional="false"/>
<parameter index="3" type="Boolean" optional="true"/>
</method>
<method name="addEventListener" declaredBy="flash.events::EventDispatcher" returnType="void">
<parameter index="1" type="String" optional="false"/>
<parameter index="2" type="Function" optional="false"/>
<parameter index="3" type="Boolean" optional="true"/>
<parameter index="4" type="int" optional="true"/>
<parameter index="5" type="Boolean" optional="true"/>
</method>
<method name="dispatchEvent" declaredBy="flash.events::EventDispatcher" returnType="Boolean">
<parameter index="1" type="flash.events::Event" optional="false"/>
</method>
</factory>
</type>
*/
就这么一小段,理解输出这么多XML信息,我们仔细来研究一下这个xml/*
输出:
<type name="flash.display::DisplayObject" base="Class" isDynamic="true" isFinal="true" isStatic="true">
<extendsClass type="Class"/>
<extendsClass type="Object"/>
<accessor name="prototype" access="readonly" type="*" declaredBy="Class"/>
<factory type="flash.display::DisplayObject">
<metadata name="Event">
<arg key="name" value="render"/>
<arg key="type" value="flash.events.Event"/>
</metadata>
<metadata name="Event">
<arg key="name" value="removedFromStage"/>
<arg key="type" value="flash.events.Event"/>
</metadata>
<metadata name="Event">
<arg key="name" value="removed"/>
<arg key="type" value="flash.events.Event"/>
</metadata>
<metadata name="Event">
<arg key="name" value="enterFrame"/>
<arg key="type" value="flash.events.Event"/>
</metadata>
<metadata name="Event">
<arg key="name" value="deactivate"/>
<arg key="type" value="flash.events.Event"/>
</metadata>
<metadata name="Event">
<arg key="name" value="addedToStage"/>
<arg key="type" value="flash.events.Event"/>
</metadata>
<metadata name="Event">
<arg key="name" value="added"/>
<arg key="type" value="flash.events.Event"/>
</metadata>
<metadata name="Event">
<arg key="name" value="activate"/>
<arg key="type" value="flash.events.Event"/>
</metadata>
<extendsClass type="flash.events::EventDispatcher"/>
<extendsClass type="Object"/>
<implementsInterface type="flash.events::IEventDispatcher"/>
<implementsInterface type="flash.display::IBitmapDrawable"/>
<accessor name="x" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="y" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="blendMode" access="readwrite" type="String" declaredBy="flash.display::DisplayObject"/>
<accessor name="scale9Grid" access="readwrite" type="flash.geom::Rectangle" declaredBy="flash.display::DisplayObject"/>
<accessor name="alpha" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="name" access="readwrite" type="String" declaredBy="flash.display::DisplayObject"/>
<accessor name="rotation" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="scrollRect" access="readwrite" type="flash.geom::Rectangle" declaredBy="flash.display::DisplayObject"/>
<accessor name="cacheAsBitmap" access="readwrite" type="Boolean" declaredBy="flash.display::DisplayObject"/>
<accessor name="accessibilityProperties" access="readwrite" type="flash.accessibility::AccessibilityProperties" declaredBy="flash.display::DisplayObject"/>
<method name="globalToLocal" declaredBy="flash.display::DisplayObject" returnType="flash.geom::Point">
<parameter index="1" type="flash.geom::Point" optional="false"/>
</method>
<accessor name="scaleX" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="visible" access="readwrite" type="Boolean" declaredBy="flash.display::DisplayObject"/>
<method name="getBounds" declaredBy="flash.display::DisplayObject" returnType="flash.geom::Rectangle">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
</method>
<accessor name="width" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="opaqueBackground" access="readwrite" type="Object" declaredBy="flash.display::DisplayObject"/>
<method name="hitTestPoint" declaredBy="flash.display::DisplayObject" returnType="Boolean">
<parameter index="1" type="Number" optional="false"/>
<parameter index="2" type="Number" optional="false"/>
<parameter index="3" type="Boolean" optional="true"/>
</method>
<accessor name="height" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="scaleY" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="mouseX" access="readonly" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="mask" access="readwrite" type="flash.display::DisplayObject" declaredBy="flash.display::DisplayObject"/>
<accessor name="parent" access="readonly" type="flash.display::DisplayObjectContainer" declaredBy="flash.display::DisplayObject"/>
<method name="getRect" declaredBy="flash.display::DisplayObject" returnType="flash.geom::Rectangle">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
</method>
<accessor name="mouseY" access="readonly" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="loaderInfo" access="readonly" type="flash.display::LoaderInfo" declaredBy="flash.display::DisplayObject"/>
<accessor name="transform" access="readwrite" type="flash.geom::Transform" declaredBy="flash.display::DisplayObject"/>
<accessor name="root" access="readonly" type="flash.display::DisplayObject" declaredBy="flash.display::DisplayObject"/>
<accessor name="stage" access="readonly" type="flash.display::Stage" declaredBy="flash.display::DisplayObject"/>
<method name="hitTestObject" declaredBy="flash.display::DisplayObject" returnType="Boolean">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
</method>
<method name="localToGlobal" declaredBy="flash.display::DisplayObject" returnType="flash.geom::Point">
<parameter index="1" type="flash.geom::Point" optional="false"/>
</method>
<accessor name="filters" access="readwrite" type="Array" declaredBy="flash.display::DisplayObject"/>
<method name="hasEventListener" declaredBy="flash.events::EventDispatcher" returnType="Boolean">
<parameter index="1" type="String" optional="false"/>
</method>
<method name="toString" declaredBy="flash.events::EventDispatcher" returnType="String"/>
<method name="willTrigger" declaredBy="flash.events::EventDispatcher" returnType="Boolean">
<parameter index="1" type="String" optional="false"/>
</method>
<method name="removeEventListener" declaredBy="flash.events::EventDispatcher" returnType="void">
<parameter index="1" type="String" optional="false"/>
<parameter index="2" type="Function" optional="false"/>
<parameter index="3" type="Boolean" optional="true"/>
</method>
<method name="addEventListener" declaredBy="flash.events::EventDispatcher" returnType="void">
<parameter index="1" type="String" optional="false"/>
<parameter index="2" type="Function" optional="false"/>
<parameter index="3" type="Boolean" optional="true"/>
<parameter index="4" type="int" optional="true"/>
<parameter index="5" type="Boolean" optional="true"/>
</method>
<method name="dispatchEvent" declaredBy="flash.events::EventDispatcher" returnType="Boolean">
<parameter index="1" type="flash.events::Event" optional="false"/>
</method>
</factory>
</type>
*/
其实你发现
<type name="flash.display::DisplayObject" base="Class" isDynamic="true" isFinal="true" isStatic="true">
这一段表示了这个类叫什么名字,路径是什么,是否是动态类,是否是不可扩展类等等
<method name="dispatchEvent" declaredBy="flash.events::EventDispatcher" returnType="Boolean">
<parameter index="1" type="flash.events::Event" optional="false"/>
</method>
这一段表示了这个类含有方法dispatchEvent,继承的flash.events::EventDispatcher,返回数据的类型为Boolean
他共有一个参数,参数类型是flash.events::Event,是必须的参数
<implementsInterface type="flash.events::IEventDispatcher"/>
<implementsInterface type="flash.display::IBitmapDrawable"/>
这两段表示了他实现了这两个接口
<extendsClass type="flash.events::EventDispatcher"/>
<extendsClass type="Object"/>
这两段表示了他继承了谁,他继承的类又继承了谁,直到Object始祖,才没有了。。
………………………………
后面就不列出来了,自己看这个把:
adobe提供的帮助文档
标签 属性 Description
<type> XML 对象的根标签。
name ActionScript 对象的数据类型的名称。
base ActionScript 对象的定义类的直接超类。 如果 ActionScript 对象是类对象,则值为 Class。
isDynamic 如果 ActionScript 对象的定义类是动态的,则为 true;否则为 false。 如果 ActionScript 对象是类对象,则值为 true,因为 Class 类是动态的。
isFinal 如果 ActionScript 对象的定义类是最终类,则为 true;否则为 false。
isStatic 如果 ActionScript 对象是类对象或构造函数,则为 true;否则为 false。 此属性之所以名为 isStatic,原因是:如果此属性为 true,则未嵌套在 factory 标记内的任何标签都是静态的。
<extendsClass> ActionScript 对象的定义类的每个超类都有一个单独的 extendsClass 标签。
type ActionScript 对象的定义类扩展的超类的名称。
<implementsInterface> ActionScript 对象的定义类或其任何超类实现的每个接口都有一个单独的 implementsInterface 标签。
type ActionScript 对象的定义类实现的接口的名称。
<accessor> 存取器是 getter 和 setter 函数定义的一个属性。
name 存取器的名称。
access 属性的访问权限。 可能的值包括 readonly、writeonly 和 readwrite。
type 属性的数据类型。
declaredBy 包含关联的 getter 或 setter 函数的类。
<constant> 常量是用 const 语句定义的一个属性。
name 常量的名称。
type 常量的数据类型。
<method> 方法是作为类定义的一部分声明的函数。
name 方法的名称。
declaredBy 包含方法定义的类。
returnType 方法的返回值的数据类型。
<parameter> 方法定义的每个参数都有一个单独的 parameter 标签。 此标签始终嵌套在 <method> 标签内。
index 一个数字,对应于参数在方法的参数列表中出现的顺序。 第一个参数的值为 1。
type 参数的数据类型。
optional 如果参数是可选参数,则为 true;否则为 false。
<variable> 变量是用 var 语句定义的一个属性。
name 变量的名称。
type 变量的数据类型。
<factory> 如果 ActionScript 对象是类对象或构造函数,则所有实例属性和方法均嵌套在此标签内。 如果 <type> 标签的 isStatic 属性为 true,则未嵌套在 <factory> 标签内的所有属性和方法都是静态的。 只有在 ActionScript 对象是类对象或构造函数时,此标签才会出现。
<type> XML 对象的根标签。
name ActionScript 对象的数据类型的名称。
base ActionScript 对象的定义类的直接超类。 如果 ActionScript 对象是类对象,则值为 Class。
isDynamic 如果 ActionScript 对象的定义类是动态的,则为 true;否则为 false。 如果 ActionScript 对象是类对象,则值为 true,因为 Class 类是动态的。
isFinal 如果 ActionScript 对象的定义类是最终类,则为 true;否则为 false。
isStatic 如果 ActionScript 对象是类对象或构造函数,则为 true;否则为 false。 此属性之所以名为 isStatic,原因是:如果此属性为 true,则未嵌套在 factory 标记内的任何标签都是静态的。
<extendsClass> ActionScript 对象的定义类的每个超类都有一个单独的 extendsClass 标签。
type ActionScript 对象的定义类扩展的超类的名称。
<implementsInterface> ActionScript 对象的定义类或其任何超类实现的每个接口都有一个单独的 implementsInterface 标签。
type ActionScript 对象的定义类实现的接口的名称。
<accessor> 存取器是 getter 和 setter 函数定义的一个属性。
name 存取器的名称。
access 属性的访问权限。 可能的值包括 readonly、writeonly 和 readwrite。
type 属性的数据类型。
declaredBy 包含关联的 getter 或 setter 函数的类。
<constant> 常量是用 const 语句定义的一个属性。
name 常量的名称。
type 常量的数据类型。
<method> 方法是作为类定义的一部分声明的函数。
name 方法的名称。
declaredBy 包含方法定义的类。
returnType 方法的返回值的数据类型。
<parameter> 方法定义的每个参数都有一个单独的 parameter 标签。 此标签始终嵌套在 <method> 标签内。
index 一个数字,对应于参数在方法的参数列表中出现的顺序。 第一个参数的值为 1。
type 参数的数据类型。
optional 如果参数是可选参数,则为 true;否则为 false。
<variable> 变量是用 var 语句定义的一个属性。
name 变量的名称。
type 变量的数据类型。
<factory> 如果 ActionScript 对象是类对象或构造函数,则所有实例属性和方法均嵌套在此标签内。 如果 <type> 标签的 isStatic 属性为 true,则未嵌套在 <factory> 标签内的所有属性和方法都是静态的。 只有在 ActionScript 对象是类对象或构造函数时,此标签才会出现。
<metadata name="Event">
<arg key="name" value="removedFromStage"/>
<arg key="type" value="flash.events.Event"/>
</metadata>
这个肯定是表明事件,但还有几个没有弄明白表示的什么,大家可以提提。。。
另外课题:
1、大家可以去用这个输出TextField看看,有几个方法,adobe并没有在帮助文档中公开,应该还有相当一部分的类有些公开的方法或属性都未公开
2、留个题目给大家,这也是腾讯曾经招flasher的一道面试题
腾讯题目
请输出stage的所有属性和所有方法
[最后修改由 sunbright, 于 2008-08-16 00:18:30]
评论Feed: http://www.xiaos8.com/feed.asp?q=comment&id=251
快速浏览
类别
标题
评论/流量
日期




- 查看svn更新内容以及最新状态(实时更新)
- 查看框架API文档(09.6.15更新)
- 查看框架代码(09.4.20更新)
框架暂停开发,且没有完全竣工,目前只能使用air包和library包!