自己写的一个Java Bean转换为HashMap及ArrayList容器的功能类,支持Hibernate

XStream转换Object生成类结构垃圾数据太多了,影响网络,仿照之前的JSON工具类的写法,自己又写了个转换到仅HashMap和ArrayList容器的类来做一下处理。

思路主要就是把Bean的成员转换到HashMap,而Colecction和数组类型转换到ArrayList。这下除了原始类型外,就只包含HashMap和ArrayList两个JAVA类了。

这样做转换处理后,再用XStream做一下转换成的数据。。。哇,这下世界清洁多了:)

package com.aherp.framework.util;

import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.json.JSONException;

/***/ /**
*转换工具类,支持反射的方式将对象转换为Map,将数组和Collection转换为List供XStrem使用
*
@authorJimWu
*
*/

public class ObjMapListUtil ... {

privatestaticObjMapListUtilinstance=null;

staticpublicObjecttoHashMap(Objectobj)throwsJSONException...{
returntoHashMap(obj,false);
}


staticpublicObjecttoHashMap(Objectobj,booleanuseClassConvert)throwsJSONException...{
if(instance==null)
instance
=newObjMapListUtil();
returninstance.getMapListObject(obj,useClassConvert);
}


/***//**
*代理类是否输出的检查,返回true则允许继续转换
*
@parambean
*
@return
*/

protectedbooleancanProxyOutput(Objectbean)...{
returntrue;
}


/***//**
*代理类时做的检查.返回应该检查的对象.
*
@parambean
*
@return
*/

protectedObjectproxyConvert(Objectbean)...{
returnbean;
}


publicObjectgetMapListObject(Objectbean,booleanuseClassConvert)...{

if(bean==null)
returnnull;
bean
=proxyConvert(bean);
Classclazz
=bean.getClass();
if(beaninstanceofNumber||beaninstanceofBoolean||beaninstanceofString)...{
returnbean;
}

if(clazz.isArray())...{

ArrayList
<Object>arrayList=newArrayList<Object>();

intarrayLength=Array.getLength(bean);
for(inti=0;i<arrayLength;i++)...{
ObjectrowObj
=Array.get(bean,i);
if(canProxyOutput(rowObj))
arrayList.add(getMapListObject(rowObj,useClassConvert));
}

returnarrayList;
}

if(beaninstanceofCollection)...{

ArrayList
<Object>arrayList=newArrayList<Object>();

Iteratoriterator
=((Collection)bean).iterator();
while(iterator.hasNext())...{
ObjectrowObj
=iterator.next();
if(canProxyOutput(rowObj))
arrayList.add(getMapListObject(rowObj,useClassConvert));
}

returnarrayList;
}

if(beaninstanceofMap)...{
HashMap
<String,Object>beanMap=newHashMap<String,Object>();

Mapmap
=(Map)bean;
Iteratoriterator
=map.keySet().iterator();
while(iterator.hasNext())...{
Objectkey
=iterator.next();
ObjectrowObj
=map.get(key);
if(canProxyOutput(rowObj))
beanMap.put(key.toString(),getMapListObject(rowObj,useClassConvert));
}

returnbeanMap;
}


HashMap
<String,Object>beanMap=newHashMap<String,Object>();
Classklass
=bean.getClass();
Method[]methods
=klass.getMethods();
for(inti=0;i<methods.length;i++)...{
try...{
Methodmethod
=methods[i];
Stringname
=method.getName();
Stringkey
="";
if(name.startsWith("get"))...{
key
=name.substring(3);
}
elseif(name.startsWith("is"))...{
key
=name.substring(2);
}

if(key.length()>0&&
Character.isUpperCase(key.charAt(
0))&&
method.getParameterTypes().length
==0)...{
if(key.length()==1)...{
key
=key.toLowerCase();
}
elseif(!Character.isUpperCase(key.charAt(1)))...{
key
=key.substring(0,1).toLowerCase()+
key.substring(
1);
}

ObjectelementObj
=method.invoke(bean);
if(elementObjinstanceofClass)...{
if(useClassConvert)
beanMap.put(key,elementObj.toString());
}

else...{
if(canProxyOutput(elementObj))
beanMap.put(key,getMapListObject(elementObj,useClassConvert));
}

}

}
catch(Exceptione)...{
/**//*forgetaboutit*/
}

}

returnbeanMap;
}



}


支持Hibernate的类则继承一下,覆盖proxyConvert和canProxyOutput方法
package com.aherp.framework.util;

import org.hibernate.collection.PersistentSet;
import org.hibernate.proxy.HibernateProxy;
import org.hibernate.proxy.LazyInitializer;
import org.json.JSONException;

/***/ /**
*扩展为支持Hibernate的工具方法.
*
@authorJimWu
*
*/

public class HiObjMapListUtil extends ObjMapListUtil ... {

privatestaticHiObjMapListUtilinstance=null;

staticpublicObjecttoHashMap(Objectobj)throwsJSONException...{
returntoHashMap(obj,false);
}


staticpublicObjecttoHashMap(Objectobj,booleanuseClassConvert)throwsJSONException...{
if(instance==null)
instance
=newHiObjMapListUtil();
returninstance.getMapListObject(obj,useClassConvert);
}


@Override
protectedObjectproxyConvert(Objectbean)...{
if(beaninstanceofHibernateProxy)...{
LazyInitializerlazyInitializer
=((HibernateProxy)bean).getHibernateLazyInitializer();
if(lazyInitializer.isUninitialized())...{
returnlazyInitializer.getIdentifier();
}
else
returnlazyInitializer.getImplementation();
}

if(beaninstanceofPersistentSet)...{
returnnewString[]...{};//忽略hibernateone-to-many
}

returnbean;
}


@Override
protectedbooleancanProxyOutput(Objectbean)...{
return!(bean!=null&&beaninstanceofPersistentSet);
}

}


P.S.发现Hibernate Session的get方法拿到的对象仅填充了一个OID而已,需要Hibernate.initialize才能继续拿到整个实体的数据。这样XStream转换才正确,否则就是一个仅OID的List而已了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值