flex 中As3Commons的使用學習

         學習Java的人,知道java中反射的强大,使用Flex是學習他的反射机制,发现有开源组件As2Commons实现flex的反射机制.

本人写的实例demo如下:

package commons
{
 
 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;
     }
  
 }
}

 

调用的test类如下:

<?xml version="1.0" encoding="utf-8"?>
<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>

 

转自:http://topmanopensource.iteye.com/category/71512?show_full=true

转自:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值