學習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
分享到:
相关推荐
本文将详细介绍如何使用As2Commons来实现Flex中的反射机制。 #### 二、As2Commons简介 As2Commons是一个基于ActionScript 3.0的开源库,提供了丰富的工具和实用程序,其中包括了对反射的支持。它为开发者提供了一...
在学习的资源中,提到了Creative Commons Attribution Non-Commercial 3.0 License,这是一种非商业用途的共享许可证,用户可以复制和分发指南,但必须遵守指定的条款。Adobe和其他公司,比如Microsoft、Apple和Sun ...
Flex代码检查PMD是一种针对ActionScript 3(AS3)代码的质量分析工具,与Java中的PMD类似。PMD( Potion Memory Debugger)最初是为Java语言设计的源代码分析器,用于检测潜在的编程错误、代码异味(code smell)...
下面将详细介绍As3commonsLog库的使用方法、主要特性以及如何将其集成到Flex项目中。 **As3commonsLog的核心特性:** 1. **多级别的日志记录**:As3commonsLog支持多种日志级别,包括`DEBUG`、`INFO`、`WARN`、`...
Flex PMD 是一款针对Flex开发的代码质量检查工具,它主要的作用是对Flex项目中的ActionScript 3(AS3)代码进行静态分析,发现潜在的编程问题、代码异味和不规范的编码习惯。PMD(Probable Bugs, Maintainability, ...
同时,还列出了其他一些库的下载链接,如as3corelib、json-lib、ezmorph等,这些都是在Flex和Java开发中常用的库,它们分别提供了AS3核心库支持、JSON处理功能和对象转换工具。 as3corelib是一个ActionScript 3的...
可以考虑使用第三方日志库,如AS3Commons的Logging框架,它提供了更完善的日志管理和配置能力。 总的来说,有效的日志记录能极大地提升Flex Air应用的可维护性和稳定性。通过自定义日志工具类,开发者可以定制适合...
总之,这个压缩包是一个完整的开发环境,适合那些希望在ActionScript 3项目中使用Spring框架和Cairngorm架构的开发者。通过这些库的集成,可以实现更强大的组件管理和测试,提高ActionScript应用程序的开发效率和...
- Flex项目通常由.mxml和.as文件组成,mxml用于定义用户界面,as用于编写业务逻辑。 - Flex使用Flash Player或Adobe AIR运行,支持跨平台运行。 2. Java基础知识: - Java是一种多平台的、面向对象的编程语言,...
然后,打开 Flex Builder 3,创建一个新的 Flex Project,命名为 EmployeeMgmt-Flex: 图 3. 新建 Flex 工程 - 第一步 Flex Project 需要指定 Server 端的配置文件地址: 图 4. 新建 Flex 工程 - 第二步 ...
然后,打开 Flex Builder 3,创建一个新的 Flex Project,命名为 EmployeeMgmt-Flex: 图 3. 新建 Flex 工程 - 第一步 Flex Project 需要指定 Server 端的配置文件地址: 图 4. 新建 Flex 工程 - 第二步 ...
- **Event与Notification**:事件是AS3的标准机制,而通知则是PureMVC特有的机制,用于更灵活地传递消息。 - **定义Notification**:通过定义特定的通知名称和类型,来标准化通信方式。 - **处理Notification**:...
as3-commons-lang: : as3-corelib: 此外,您需要将 flex 移动组件包包含到 Flex 构建路径中: ${FLEXSDK}/frameworks/libs/mobile/mobilecomponents.swc ${FLEXSDK}/frameworks/themes/Mobile/mobile.swc
3. AirExcel.rar,as3xls.rar:air下Excel开发包 4. csvlib-1.4.1.rar:生成cvs格式数据 5. jxls-reader-0.9.6.jar,commons-jexl-1.1.jar,jxls-core-0.9.6.jar:jxls操作Excel的开发包,与poi共同构成当前java下...
3. 关于文档中的技术术语: - ActionScript是Adobe Flash平台的主要编程语言,用于控制电影剪辑,处理用户输入和交互,以及访问本地系统资源。 - ColdFusion是Adobe推出的一个用于快速开发基于Web的应用程序的...
你可以从官方网站或其他第三方源下载插件,如AS3 Commons、FlashLibs等,它们提供了丰富的库和工具,以满足不同开发需求。安装插件通常只需将插件文件复制到FlashDevelop的“Plugins”目录下,并在重启后启用。 总...
Creative Commons BY-ND-NC Foreword: Beta 0.16 Preface 1. How to Use this Book 2. Your Feedback 3. Font Conventions 4. Maven Writing Conventions 5. Acknowledgements 1. 介绍 Apache Maven 1.1....
Flex使用ActionScript 3编程语言,支持MXML标记语言,允许开发者用面向对象的方式构建UI组件。 2. **XML数据驱动**:CaseSim的核心特性是利用XML文件来存储和管理模拟案例的界面和内容。XML是一种结构化数据格式,...