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反編譯相關源碼閱讀可以很明了看清楚其工作原理