`
lianxiangbus
  • 浏览: 527668 次
文章分类
社区版块
存档分类
最新评论

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

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

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

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

packagecom.aherp.framework.util;

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

importorg.json.JSONException;

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

publicclassObjMapListUtil...{

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方法
packagecom.aherp.framework.util;

importorg.hibernate.collection.PersistentSet;
importorg.hibernate.proxy.HibernateProxy;
importorg.hibernate.proxy.LazyInitializer;
importorg.json.JSONException;

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

publicclassHiObjMapListUtilextendsObjMapListUtil...{

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而已了
分享到:
评论

相关推荐

    java面试宝典

    42、一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 12 43、说出一些常用的类,包,接口,请各举5 个。 12 44、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类?是否可以...

    Java常见面试题208道.docx

    面试题包括以下十九部分:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql...

    java面试题

    请写一个java程序实现线程连接池功能? 122 84.13. 编一段代码,实现在控制台输入一组数字后,排序后在控制台输出; 122 84.14. 列出某文件夹下的所有文件; 123 84.15. java调用系统命令实现删除文件的操作; 123 ...

    千方百计笔试题大全

    42、一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 12 43、说出一些常用的类,包,接口,请各举5 个。 12 44、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类?是否可以...

    Java面试宝典-经典

    给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写? 125 19、Jdo是什么? 125 20、什么是spring的IOC AOP 126 21、STRUTS的工作流程! 126 22、spring 与EJB的区别!! 126 八. ...

    Java面试宝典2010版

    给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写? 125 19、Jdo是什么? 125 20、什么是spring的IOC AOP 126 21、STRUTS的工作流程! 126 22、spring 与EJB的区别!! 126 八. ...

    java面试题大全(2012版)

    给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写? 125 19、Jdo是什么? 125 20、什么是spring的IOC AOP 126 21、STRUTS的工作流程! 126 22、spring 与EJB的区别!! 126 八. ...

    最新Java面试宝典pdf版

    给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写? 125 19、Jdo是什么? 125 20、什么是spring的IOC AOP 126 21、STRUTS的工作流程! 126 22、spring 与EJB的区别!! 126 八. ...

    Java面试笔试资料大全

    给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写? 125 19、Jdo是什么? 125 20、什么是spring的IOC AOP 126 21、STRUTS的工作流程! 126 22、spring 与EJB的区别!! 126 八. ...

    java面试宝典2012

    给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写? 137 19、Jdo是什么? 137 20、什么是spring的IOC AOP 137 21、STRUTS的工作流程! 137 22、spring 与EJB的区别!! 137 八. ...

    JAVA面试宝典2010

    给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写? 125 19、Jdo是什么? 125 20、什么是spring的IOC AOP 126 21、STRUTS的工作流程! 126 22、spring 与EJB的区别!! 126 八. ...

    Java面试宝典2012版

    给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写? 125 19、Jdo是什么? 125 20、什么是spring的IOC AOP 126 21、STRUTS的工作流程! 126 22、spring 与EJB的区别!! 126 ...

    Java面试宝典2012新版

    给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写? 125 19、Jdo是什么? 125 20、什么是spring的IOC AOP 126 21、STRUTS的工作流程! 126 22、spring 与EJB的区别!! 126 八. ...

    Java学习笔记-个人整理的

    {4.1}\ttfamily java.util.ArrayList}{80}{section.4.1} {4.2}\ttfamily java.util.LinkedList}{81}{section.4.2} {4.3}贪吃蛇案例}{82}{section.4.3} {4.4}散列表与HashMap}{83}{section.4.4} {4.4.1}java....

    Java 面试宝典

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? ...... 7 2、Java 有没有 goto? .......................................................................................................

Global site tag (gtag.js) - Google Analytics