克隆工具类

</pre><pre name="code" class="html">package com.hjx.uitls
{
	import flash.geom.Point;
	import flash.utils.Dictionary;
	import flash.utils.describeType;
	import flash.utils.getDefinitionByName;
	import flash.utils.getQualifiedClassName;
	
	import mx.collections.ArrayCollection;
	import mx.core.UIComponent;
	import mx.utils.ObjectUtil;

	/**
	 * @date 2014-6-4,@author 黄记新
	 */
	public class CloneUtil
	{
		private static var  excluded:Dictionary;
		
		public function CloneUtil()
		{
		}
		
		
		public static function clone(obj:Object):Object
		{
			var instance:Object = null;
			
			try {
				var xmlType:XML = describeType(obj);
				var typeName:String = 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("Vector") >= 0)
				{
					var vector:Vector = new Vector();
					for each(var item:Object in vector)
					{
						vector.push(clone(item));
					}
					return vector;
				}else if(typeName.search("ArrayCollection") >= 0)
				{
					var coll:ArrayCollection = new ArrayCollection();
					for each(var item1:Object in obj)
					{
						coll.addItem(clone(item1));
					}
					return coll;
				}else if(obj is Point){
					return Point(obj).clone();
				}
				
				var className:String = getQualifiedClassName(obj);
				var clazz:Class = Class(getDefinitionByName(className));
				
				instance = new clazz();
				
				cloneStyle(obj,instance);
				
				var options:Object = new Object();
				options["includeReadOnly"] = false;
				if(!excluded){
					excluded = new Dictionary();
				}
				var excludes:Array = excluded[className] as Array;
				if(excludes == null){
					excludes = getExcludedProperties(obj);
					excluded[className] = excludes;
				}
				
				var objInfo:Object = ObjectUtil.getClassInfo(obj, excludes, options);
				var fieldName:Array = objInfo["properties"] as Array; 
				for each(var q:QName in fieldName){
					if(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;
		}
		
		
		protected static function getExcludedProperties(object:Object) : Array
		{
			if(object is UIComponent)
				return getRendererProperties();
			else
				return new Array();
		}
		
		private static var rendererProperties:Array = null;
		
		private static function getRendererProperties() : Array 
		{
			if(rendererProperties == null){
				rendererProperties = new Array();
				for each(var name:QName in ObjectUtil.getClassInfo(new UIComponent())["properties"]){
					var pname:String = name.localName;
					if(pname != "left" &&
						pname != "top" &&
						pname != "x" &&
						pname != "y" &&
						pname != "width" &&
						pname != "height")
						rendererProperties.push(pname);
				}
			}
			return rendererProperties;
		}
		public static function isBasicTypeName(typeName:String):Boolean
		{
			return (typeName == "String"
				|| typeName == "int"
				|| typeName == "uint"
				|| typeName == "Boolean"
				|| typeName == "Number"
				|| typeName == "null");
		}
		
		public static function cloneStyle(renderer:Object, cloneRenderer:Object):void
		{
			var describe:* = describeType(renderer);
			var objectMetadata:* = describe.metadata;
			var styleProp:XMLList = objectMetadata.(@name=="Style").arg.(@key=="name");
			for each (var xml:XML in styleProp) 
			{
				cloneRenderer.setStyle(xml.@value,renderer.getStyle(xml.@value));
			}
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值