原文地址:http://xiejiangbo.iteye.com/blog/599679
import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;
import flash.utils.getQualifiedSuperclassName;
1.获取实例的类名:
public function getQualifiedClassName(value:*):String
2.获取实例的超类
public function getQualifiedSuperclassName(value:*):String
3.通过类的名字获取到Class对象
public function getDefinitionByName(name:String):Object
4.通过Class对象获取实例
比如
var cls:Class =getDefinitionByName(“mx.controls::TextInput”) as Class;
var txtinput:TextInput =new cls() as TextInput;
txtinput.text=“test”;
co1.addChild(txtinput);
5.获取类的信息:字段、方法
public function describeType(value:*):XML
生成一个 XML 对象来描述参数中指定的 ActionScript 对象, 这个方法使 ActionScript 实现了反射编程的概念.
1.
var dummy:Dummy = new Dummy();
var instanceInfo:XML = describeType(dummy);
var properties:XMLList = instanceInfo..accessor.(@access != ”writeonly”) + instanceInfo..variable;
for each (var propertyInfo:XML in properties) …{
var propertyName:String = propertyInfo.@name;
trace(dummy[propertyName]);
}
2.
var sprite1:Sprite = new Sprite();
var instanceInfo:XML = describeType(sprite1);
3.
package
…{
import flash.utils.describeType;
import flash.utils.getQualifiedClassName;
import flash.utils.getDefinitionByName;
/** *//**
* 使用 flash.utils.describeType 获取类详细信息并缓存
* @author kakera
*
*/
public class TypeDescriptor
…{
/** *//**
* 缓存已经反射过了的对象
*/
private static var typeCache:Object = new Object();
/** *//**
* 获取类信息
* @param target 要获取的目标对象
* @return TypeDescriptorEntry 实例
*
*/
public static function describeType (target:*):TypeDescription …{
var className:String = getQualifiedClassName(target);
/** *//**
* 检查缓存中是否已经有目标对象项, 如果有就返回缓存中的内容
*/
if (className in typeCache)
return typeCache[className];
/** *//**
* 暂存属性列表
*/
var propertyNames:Array = [];
/** *//**
* 获取类信息, 如果传入的是实例则获取实例类型的类信息
*/
var typeInfo:XML = flash.utils.describeType(target is Class ? target : getDefinitionByName(className) as Class);
/** *//**
* 获取类中所有的属性和访问器
*/
var properties:XMLList = typeInfo.factory..accessor.(@access != ”writeonly”) + typeInfo..variable;
/** *//**
* 遍历并存放到 propertyNames 中
*/
for each (var propertyInfo:XML in properties)
propertyNames.push(propertyInfo.@name);
/** *//**
* 创建 TypeDescriptorEntry 的实例并把 propertyNames 等属性丢进去
*/
var entry:TypeDescription = new TypeDescription();
entry.name = className;
entry.properties = propertyNames;
entry.typeInfo = typeInfo;
/** *//**
* 缓存到 typeCache 中以便下次从缓存中读取
*/
typeCache[className] = entry;
return entry;
}
/** *//**
* 静态类无须实例化
* @return
*
*/
public function TypeDescriptor () …{ }
}
}
TypeDescription.as, 负责保存信息
package
…{
public class TypeDescription
…{
/** *//**
* 类的属性列表, 包括访问器 (accessor) 和变量 (variable)
*/
public var properties:Array; /**//* of String */
/** *//**
* 类名
*/
public var name:String;
/** *//**
* 由 flash.utils.describeType() 获取的原始 XML 数据
*/
public var typeInfo:XML;
public function TypeDescription () …{ }
}
}
FLEX 反射
最新推荐文章于 2024-07-15 11:00:33 发布