flex 中As3Commons的施用學習
學習Java的人,知道java中反射的强大,使用Flex是學習他的反射机制,发现有开源组件As2Commons实现flex的反射机制. 本人写的实例demo如下: package commons 调用的test类如下: <?xml version="1.0" encoding="utf-8"?> 转自:
{
import org.as3commons.logging.ILogger;
import org.as3commons.logging.LoggerFactory;
import org.as3commons.reflect.ClassUtils;
import org.as3commons.reflect.Constant;
import org.as3commons.reflect.Constructor;
import org.as3commons.reflect.Field;
import org.as3commons.reflect.MetadataUtils;
import org.as3commons.reflect.Method;
import org.as3commons.reflect.Parameter;
import org.as3commons.reflect.Type;
import org.as3commons.reflect.Variable;
import mx.utils.ObjectProxy;
/**
* AS3commons 的学习的应用
*
*/
public class CommonRelection
{
//用于记录日志信息
var logger:ILogger=LoggerFactory.getClassLogger(CommonRelection);
public function CommonRelection()
{
}
/**
*
* 獲取类的信息
*/
public function getClassInfo(clazz:Class):Type
{
//獲取类的元数据對象
var type:Type=Type.forClass(clazz);
//獲取非静态常量
var constArrays:Array=type.constants;
//
var varArray:Array=type.staticVariables;
//獲取类的全名称
var className:String=type.fullName;
trace("classname= "+className);
var constructor:Constructor =type.constructor;
var params:Array=constructor.parameters;
var ps:String="";
for(var i:int=0;i<params.length;i++)
{
var p:Parameter=params[i] as Parameter;
ps+=p.type.name+" index ="+p.index;
}
trace(" name ="+constructor.declaringType.name+"paramers="+ps);
//獲取绑定的属性
var bindable:Array=type.getMetaData("Bindable");
var m:Method=type.getMethod("setEmp");
//獲取静态常量
var constArray:Array=type.staticConstants;
for(var i=0;i<constArray.length;i++)
{
var aconst:Constant=constArray[i] as Constant;
trace("name ="+aconst.name+" DeclareType="+aconst.declaringType.fullName);
}
return null;
}
/**
*
* 根据类名查找类
* @params clazzName 例如:
* com.company.domain.Person
* com.company.domain::Person
*/
public function getClass(clazzName:String):Type
{
//獲取类的元数据對象 相等与Java 中Class
var type:Type=Type.forName(clazzName);
return type;
}
/**
*
* 根据类名查找类的所用的属性
*
*/
public function getFields(o:Object):void
{
var xml:XML=MetadataUtils.getFromObject(o);
trace("xml" +xml);
//獲取對象的類名信息
var clazz:Class=ClassUtils.forInstance(o);
//得到反射类的對象
var type:Type=Type.forInstance(o);
//获取类中属性和变量
var fields:Array=type.fields;
for(var i:int=0;i<fields.length;i++)
{
var field:Field=fields[i] as Field;
if(field is Variable)
{
trace("Name ="+ field.name+" "+" Value="+field.getValue(o));
}
}
}
/**
*
* 根据类名查找类的所用的属性
*/
public function existsField(o:Object,field:String):Object
{
//獲取對象的類名信息
var clazz:Class=ClassUtils.forInstance(o);
//得到反射类的對象
var type:Type=Type.forInstance(o);
var vars:Array=type.variables;
//检测类中是否有某个属性
if(clazz.hasOwnProperty(field))
{
var sfield:Field=type.getField(field);
trace("Name ="+ sfield.name+" "+" Value="+sfield.getValue(o));
}else{
logger.info(" can't the {0} in the class of {1}",field,type.name);
}
return null;
}
/**
*
* 根据类名查找类的方法
* @params clazzName 例如:
* com.company.domain.Person
* com.company.domain::Person
*/
public function getMethods(clazz:Class):Type
{
//得到反射类的對象
var type:Type=Type.forClass(clazz);
//var type:Type=Type.forClass(clazz);
//获取类中属性
var methods:Array=type.methods;
for(var i:int=0;i<methods.length;i++)
{
var method:Method=methods[i] as Method;
trace("Name ="+ method.name+" "+"return type="+method.returnType.name);
}
return null;
}
/**
* 动态调用类中方法
*/
public function invokeMethod(o:Object,method:String,args:Array=null):*
{
//獲取类的元数据對象
var type:Type=Type.forInstance(o);
var data:*;
//獲取类的方法
var m:Method=type.getMethod(method);
if(m!=null)
{
data=m.invoke(o,args);
}
return data;
}
}
}
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="init()" layout="absolute" xmlns:view="commons.*">
<mx:Script>
<![CDATA[
import model.Employee;
import commons.CommonRelection;
public function init():void
{
var a:CommonRelection=new CommonRelection();
var emp:Employee=new Employee();
a.existsField(emp,"empName");
a.getClass("model.Employee");
a.getClassInfo(Employee);
a.getFields(emp);
a.getMethods(Employee);
a.invokeMethod(emp,"setEmpName",["xiaobai"]);
trace(emp.getEmpName());
//com.company.domain.Person
//com.company.domain::Person
}
]]>
</mx:Script>
</mx:Application>