打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Flex通用克隆(clone)方法

Flex通用克隆(clone)方法

分类: LINUX 其它 103人阅读 评论(0) 收藏 举报

为每个Vo一一书写clone()方法是一件麻烦事,利用flex的反射功能可实现较通用的克隆方法,本方法可保留类型信息,比flex自带的ObjecProxy的copy()和clone()好用哦,代码如下:

    import flash.utils.ByteArray;
    import flash.utils.describeType;
    import flash.utils.getDefinitionByName;
    import flash.utils.getQualifiedClassName;
   
    import mx.collections.ArrayCollection;
    import mx.collections.IList;
    import mx.formatters.DateFormatter;
    import mx.utils.ObjectUtil;
   
    public class CommonUtil extends Object

    {

        public static function clone(obj:Object):Object
        {
            var instance:Object = null;
                    
            try {
                var xmlType:XML = describeType(obj);
                var typeName:String = http://blog.csdn.net/lazyclough/article/details/mailto:xmlType.@name;
                if(isBasicTypeName(typeName)) return obj;           
                if(typeName == "Array")
                {
                    var arr:Array = new Array();
                    for(var i:String in obj)
                    {
                        arr[i] = clone(obj[i]);
                    }
                    return arr;
                }
                else if(typeName.search("ArrayCollection") >= 0)
                {
                    var coll:ArrayCollection = new ArrayCollection();
                    for each(var item:Object in obj)
                    {
                        coll.addItem(clone(item));
                    }
                    return coll;
                }
               
                var className:String = getQualifiedClassName(obj);
                var clazz:Class = Class(getDefinitionByName(className));
                instance = new clazz();
               
                var objInfo:Object = ObjectUtil.getClassInfo(obj);
                var fieldName:Array = objInfo["properties"] as Array;
                for each(var q:QName in fieldName){
                    //trace(q.localName);
                    if(http://blog.csdn.net/lazyclough/article/details/mailto:xmlType.@isDynamic == "true")
                    {
                        instance[q.localName] = clone(obj[q.localName]);
                    }
                    else
                    {
                        var accs:XMLList = xmlType..accessor.(@name == q.localName);
                        if(accs != null && accs.length() > 0 && (accs[0].@access == "readwrite" || accs[0].@access == "write"))
                        {
                            instance[q.localName] = clone(obj[q.localName]);
                        }
                    }
                }
            }
            catch(e:ReferenceError)
            {
                trace(e);
            }
            catch(e:TypeError)
            {
                trace(e);
            }  
           
            return instance;
        }

 

        public static function isBasicTypeName(typeName:String):Boolean
        {
            return (typeName == "String"
                || typeName == "int"
                || typeName == "uint"
                || typeName == "Boolean"
                || typeName == "Number"
                || typeName == "null");
        }

    }

使用方法:

public class A    
{  
    private var _a:int = 1;
    private var _arr:Array = ['a', 'b', 'c'];   
    public function get a():int
    {
        return _a;
    }
    public function set a(value:int):void
    {
        _a = value;
    }
    public function get arr():Array
    {
        return _arr;
    }
    public function set arr(value:Array):void
    {
        _arr = value;
    }
}

var a:A = new A();

var b:A = CommonUtil.clone(a);       // b是a的一个副本

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Web前端面试题目及答案汇总 – 码农网
javascript 数组的深度复制
【转】谈谈Flex中ArrayCollection的复制(克隆)
Flex中ArrayCollection 与java中的ArrayList互转
flex的array和arraycollection
js变量
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服