天天看點

ASObject 在背景java處理

Hi樓主

我試過不建立As對象也可以實作java對象的轉換

flex相關jar包中java對象轉換到AS對象中間有個ASObject(一個java類繼承MAP)他把java類的屬性讀出放到其Map映射傳回到flex前台就是ASObject了

就是說你new 一個ASOBject 按照MAP設定好屬性,值 到前台就是一個ASObject對象可以直接用該對象取值

總結就是:

flex對象傳到java(如果沒經過綁定強轉)都看成ASObject 其為一個Map型集合可以通過類屬性充當Key從中取值

flex中集合傳來都看成flex.messaging.io.ArrayCollection該集合實作List接口傳遞給flex flex可以直接識别

flexObjec <--> ASObject(flex.messaging.io.amf.ASObject) <---> javaObject

flexArray <--> ArrayCollection(flex.messaging.io.ArrayCollection) <---> javaArray(List)

例:我查詢資料庫傳回ASObject到flex

import flex.messaging.io.ArrayCollection;

public ArrayCollection getSqlData(String sql)

    {

       ArrayCollection asList = new ArrayCollection(jdbc.getSqlData(sql));  

        return asList;

    }

這是我自己寫的一個類嘗試轉換的 時間久遠那些方法測試過沒我也忘了(基于Spring相關類)

代碼 複制 - 運作

/**
			  * flex類未指定對應java對象
			  * 
			  * 将flex送出于java背景的資料對應到java對象中
			  * @param fromObj
			  * @param toObj
			  */
			 public static void flexObjectToVo(ASObject fromObj,Object toObj)
			 {
				 Assert.notNull(fromObj, "Flex對象為空");
				 Assert.notNull(toObj, "java對象為空");
				 PropertyDescriptor targetPds[] = BeanUtils.getPropertyDescriptors(toObj.getClass());  //周遊擷取java對象全部屬性
				 for (Object obj : targetPds)  //循環周遊屬性
				 {
					 PropertyDescriptor targetPd = (PropertyDescriptor)obj;
			         if(targetPd.getWriteMethod() == null) //擷取該屬性的set方法如果無則繼續下次循環
			             continue;
			         
			         //有set方法的屬性 vo的正常屬性
			         try
			         {
			         Object value = fromObj.get(targetPd.getName()); //flex送出的值
			         Method writeMethod = targetPd.getWriteMethod();
		             if(!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers()))
		                 writeMethod.setAccessible(true); //設定到Vo
		             writeMethod.invoke(toObj, new Object[] {value});
			         }
			         catch(Throwable e)
			         {
			        	 System.out.println("從flex拷值到java對象錯誤"+e.getMessage()+"\n 目前造成錯誤的屬性"+targetPd.getName());
			        	 continue; //目前屬性為空 繼續指派
			         }
					
				 }
			 }
			 
			 
			 /**
			  * flex類未指定對應java對象
			  * 
			  * 将flex送出于java背景的資料對應到java對象中
			  * @param fromObj
			  * @param toObj
			  */
			 public static Object getflexObjectToVo(ASObject fromObj,Object toObj)
			 {
				 Assert.notNull(fromObj, "Flex對象為空");
				 Assert.notNull(toObj, "java對象為空");
				 PropertyDescriptor targetPds[] = BeanUtils.getPropertyDescriptors(toObj.getClass());  //周遊擷取java對象全部屬性
				 for (Object obj : targetPds)  //循環周遊屬性
				 {
					 PropertyDescriptor targetPd = (PropertyDescriptor)obj;
			         if(targetPd.getWriteMethod() == null) //擷取該屬性的set方法如果無則繼續下次循環
			             continue;
			         
			         //有set方法的屬性 vo的正常屬性
			         try
			         {
			         Object value = fromObj.get(targetPd.getName()); //flex送出的值
			         Method writeMethod = targetPd.getWriteMethod();
		             if(!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers()))
		                 writeMethod.setAccessible(true); //設定到Vo
		             writeMethod.invoke(toObj, new Object[] {value});
			         }
			         catch(Throwable e)
			         {
			        	 System.out.println("從flex拷值到java對象錯誤"+e.getMessage()+"\n 目前造成錯誤的屬性"+targetPd.getName());
			        	 continue; //目前屬性為空 繼續指派
			         }
					
				 }
				 return toObj;
			 }
			 
			 /**
			  * flex類指定對應java對象
			  * 
			  * 将flex送出于java背景的資料對應到java對象中
			  * @param fromObj
			  * @param toObj
			  */
			 public static Object flexObjectToVo(ASObject fromObj)
			 {
				 Object toObj = null;
				 try
				 {
				  toObj = Class.forName(fromObj.getType()).newInstance();
				 }catch (Exception e)
				 {
					 System.out.println("從flex指定類型中擷取java類失敗"+e.getMessage());
					 return null;
				 }
				 
				 Assert.notNull(fromObj, "Flex對象為空");
				 Assert.notNull(toObj, "java對象為空");
				 PropertyDescriptor targetPds[] = BeanUtils.getPropertyDescriptors(toObj.getClass());  //周遊擷取java對象全部屬性
				 for (Object obj : targetPds)  //循環周遊屬性
				 {
					 PropertyDescriptor targetPd = (PropertyDescriptor)obj;
			         if(targetPd.getWriteMethod() == null) //擷取該屬性的set方法如果無則繼續下次循環
			             continue;
			         
			         //有set方法的屬性 vo的正常屬性
			         try
			         {
			         Object value = fromObj.get(targetPd.getName()); //flex送出的值
			         Method writeMethod = targetPd.getWriteMethod();
		             if(!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers()))
		                 writeMethod.setAccessible(true); //設定到Vo
		             writeMethod.invoke(toObj, new Object[] {value});
			         }
			         catch(Throwable e)
			         {
			        	 System.out.println("從flex拷值到java對象錯誤"+e.getMessage()+"\n 目前造成錯誤的屬性"+targetPd.getName());
			        	 continue; //目前屬性為空 繼續指派
			         }
					
				 }
				 
				 return toObj;
			 }
             
			 /**
			  * 将flex傳遞與java的集合轉換成toObj形式并以集合傳回
			  * @param ASOList
			  * @param toObj
			  * @return
			  */
			 public static List flexObjectToVo(List ASOList,Object toObj)
			 {
				 Assert.notNull(toObj, "java對象為空");
				 List<Object> returnList = new LinkedList<Object>();
				 for ( int i = 0 ; i < ASOList.size(); i++)
				 {
					 ASObject asObj = (ASObject)ASOList.get(i);
					 returnList.add(getflexObjectToVo(asObj,toObj));
				 }
				 return returnList;
			 }
			 
			 /**
			  * 将結果集放到as對象
			  * @param asObject
			  * @param rs
			  */
			 public static void getChartFlexList(ASObject asObject,ResultSet rs)
			 {
				 try {
					int ci = rs.getMetaData().getColumnCount();
					for (int i = 1 ; i <=ci ; i++)
					{			
						asObject.put(rs.getMetaData().getColumnName(i), rs.getObject(i));		
					}
				} catch (SQLException e) {
					System.out.println("sql 異常"+e.getMessage());
				} //總列數
			 }
			 
			 
			 /**
			  * 将結果集放到as集合中 這樣實作結果集有序及重複
			  * @param asObject
			  * @param rs
			  */
			 public static void getChartFlexList(ArrayCollection asList,ResultSet rs)
			 {
				 try {
					int ci = rs.getMetaData().getColumnCount();
					
					for (int i = 1 ; i <=ci ; i++)						
					{	
						ASObject asObject = new ASObject();	
						asObject.put(rs.getMetaData().getColumnName(i), rs.getObject(i));	
						asList.add(asObject);
					}
				} catch (SQLException e) {
					System.out.println("sql 異常"+e.getMessage());
				} //總列數
			 }
           

在此給大家一個建議下個jad反編譯相關源碼閱讀可以很明了看清楚其工作原理