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而已了
分享到:
相关推荐
42、一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 12 43、说出一些常用的类,包,接口,请各举5 个。 12 44、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类?是否可以...
面试题包括以下十九部分:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql...
请写一个java程序实现线程连接池功能? 122 84.13. 编一段代码,实现在控制台输入一组数字后,排序后在控制台输出; 122 84.14. 列出某文件夹下的所有文件; 123 84.15. java调用系统命令实现删除文件的操作; 123 ...
42、一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 12 43、说出一些常用的类,包,接口,请各举5 个。 12 44、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类?是否可以...
给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写? 125 19、Jdo是什么? 125 20、什么是spring的IOC AOP 126 21、STRUTS的工作流程! 126 22、spring 与EJB的区别!! 126 八. ...
给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写? 125 19、Jdo是什么? 125 20、什么是spring的IOC AOP 126 21、STRUTS的工作流程! 126 22、spring 与EJB的区别!! 126 八. ...
给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写? 125 19、Jdo是什么? 125 20、什么是spring的IOC AOP 126 21、STRUTS的工作流程! 126 22、spring 与EJB的区别!! 126 八. ...
给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写? 125 19、Jdo是什么? 125 20、什么是spring的IOC AOP 126 21、STRUTS的工作流程! 126 22、spring 与EJB的区别!! 126 八. ...
给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写? 125 19、Jdo是什么? 125 20、什么是spring的IOC AOP 126 21、STRUTS的工作流程! 126 22、spring 与EJB的区别!! 126 八. ...
给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写? 137 19、Jdo是什么? 137 20、什么是spring的IOC AOP 137 21、STRUTS的工作流程! 137 22、spring 与EJB的区别!! 137 八. ...
给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写? 125 19、Jdo是什么? 125 20、什么是spring的IOC AOP 126 21、STRUTS的工作流程! 126 22、spring 与EJB的区别!! 126 八. ...
给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写? 125 19、Jdo是什么? 125 20、什么是spring的IOC AOP 126 21、STRUTS的工作流程! 126 22、spring 与EJB的区别!! 126 ...
给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写? 125 19、Jdo是什么? 125 20、什么是spring的IOC AOP 126 21、STRUTS的工作流程! 126 22、spring 与EJB的区别!! 126 八. ...
{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....
1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? ...... 7 2、Java 有没有 goto? .......................................................................................................