java pojo 转 map_如何将POJO对象转换成MAP

本文介绍如何将Java中的POJO对象转换成Map对象,主要通过反射和CGLib库实现。提供了类分析器和对象分析器的代码示例,以及一个测试用例,展示了如何将复杂的对象结构转换成Map并输出其内容。
摘要由CSDN通过智能技术生成

展开全部

很多情况需要将取得的POJO对象转换成其他表现形式,如Key-Value的Map形式,用于数据展现.本文介绍如何e5a48de588b662616964757a686964616f31333337376262将取得的POJO对象实例后如何转换成Map对象.代码如下

1、类分析器代码,主要是分析类的构造取得类定义的属性和get/set方法

import java.lang.reflect.Field;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

import org.hibernate.PropertyNotFoundException;

import org.hibernate.property.BasicPropertyAccessor;

import org.hibernate.property.Getter;

import org.hibernate.property.Setter;

import test.entity.User;

/**

* 分析POJO类抽取类定义的属性和get/set方法

* @author shygiant

*

*/

public class ClassAnalysis {

private Class analysisClass;

private List propertys=new ArrayList();

private List propMeatList=new ArrayList();

private String[] getterNames;

private String[] setterNames;

private Getter[] getters;

private Setter[] setters;

private Class[] propTypes;

private String[] propertyNames;

public ClassAnalysis(Class clazz)

{

this.analysisClass=clazz;

getPropertys(analysisClass);

Iterator itr=propertys.iterator();

BasicPropertyAccessor propertyAccessor=new BasicPropertyAccessor();

while(itr.hasNext())

{

Field field=(Field)itr.next();

ClassPropertyMeta propertyMeta=new ClassPropertyMeta();

try

{

String propertyName=field.getName();

propertyMeta.setProperty(field);

propertyMeta.setGetter(propertyAccessor.getGetter(clazz,propertyName));

propertyMeta.setSetter(propertyAccessor.getSetter(clazz,propertyName));

propertyMeta.setPropType(propertyMeta.getGetter().getReturnType());

propMeatList.add(propertyMeta);

}

catch(PropertyNotFoundException ex)

{

}

}

convertToAry();

}

private void getPropertys(Class clazz)

{

if(clazz!=null&&clazz!=Object.class)

{

Class curClass=clazz.getSuperclass();

getPropertys(curClass);

Field[] fileds=clazz.getDeclaredFields();

for(int i=0;i

{

propertys.add(fileds[i]);

}

}

}

private void convertToAry()

{

int properspan=propMeatList.size();

getters=new Getter[properspan];

getterNames=new String[properspan];

setterNames=new String[properspan];

setters=new Setter[properspan];

propTypes=new Class[properspan];

propertyNames=new String[properspan];

Iterator itr=propMeatList.iterator();

int i=0;

while(itr.hasNext())

{

ClassPropertyMeta propertyMeta=(ClassPropertyMeta)itr.next();

if(propertyMeta!=null)

{

String propertyName=propertyMeta.getProperty().getName();

propertyNames[i]=propertyName;

getters[i]=propertyMeta.getGetter();

setters[i]=propertyMeta.getSetter();

propTypes[i]=getters[i].getReturnType();

getterNames[i]=getters[i].getMethodName();

setterNames[i]=setters[i].getMethodName();

i++;

}

}

}

public class ClassPropertyMeta

{

private Field property;

private Getter getter;

private Setter setter;

private Class propType;

public Field getProperty() {

return property;

}

public void setProperty(Field property) {

this.property = property;

}

public Getter getGetter() {

return getter;

}

public void setGetter(Getter getter) {

this.getter = getter;

}

public Setter getSetter() {

return setter;

}

public void setSetter(Setter setter) {

this.setter = setter;

}

public Class getPropType() {

return propType;

}

public void setPropType(Class propType) {

this.propType = propType;

}

}

public Getter[] getGetters()

{

return getters;

}

public Setter[] getSetters()

{

return setters;

}

public Class[] getPropTypes()

{

return propTypes;

}

public String[] getPropertyNames() {

return propertyNames;

}

public String[] getGetterNames() {

return getterNames;

}

public String[] getSetterNames() {

return setterNames;

}

public static void main(String[] args)

{

User user=new User();

user.setUserId(new Integer("1"));

user.setUserName("abc");

user.setUserPassword("psw");

ClassAnalysis pojoAnalysis=new ClassAnalysis(user.getClass());

Getter[] getters=pojoAnalysis.getGetters();

Class[] propTypes=pojoAnalysis.getPropTypes();

for(int i=0;i

{

System.out.println("getter:="+getters[i].getMethodName());

System.out.println("propTypes:="+propTypes[i].getName());

}

}

public Class getAnalysisClass() {

return analysisClass;

}

}

2、对象分析器代码

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Stack;

import net.sf.cglib.beans.BulkBean;

public class ObjAnalysis {

private Map map;

private String propName="";

private Stack stack;

public ObjAnalysis(Object obj,Class clazz)

{

map=new HashMap();

stack=new Stack();

ClassAnalysis classAnalysis=new ClassAnalysis(clazz);

convertObjToMap(obj,classAnalysis);

}

private void convertObjToMap(Object obj,ClassAnalysis classAnalysis)

{

String[] propertyNames=classAnalysis.getPropertyNames();

String[] getters=classAnalysis.getGetterNames();

String[] setters=classAnalysis.getSetterNames();

Class[] types=classAnalysis.getPropTypes();

BulkBean bulkbean=BulkBean.create(classAnalysis.getAnalysisClass(), getters, setters, types);

Object[] objPropertyValues=bulkbean.getPropertyValues(obj);

for(int i=0;i

{

stack.push(propertyNames[i]);

propName=getPropName(stack);

map.put(propName,objPropertyValues[i]);

if(objPropertyValues[i]!=null)

{

ClassAnalysis clazzAnaly2=new ClassAnalysis(objPropertyValues[i].getClass());

if(clazzAnaly2.getPropertyNames()!=null&&clazzAnaly2.getPropertyNames().length>0)

{

convertObjToMap(objPropertyValues[i],clazzAnaly2);

}

}

stack.pop();

}

}

private String getPropName(Stack stack)

{

String propName="";

Iterator itr=stack.iterator();

int i=0;

while(itr.hasNext())

{

if(i==0)

{

propName=itr.next().toString();

}

else

{

propName+="."+itr.next().toString();

}

i++;

}

return propName;

}

public Map getObjPropertyMap()

{

return map;

}

}

3、辅助类

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import net.sf.cglib.beans.BulkBean;

public class SqlUtil {

public static List convertRsToList(ResultSet rst) throws Exception{

List list = new ArrayList();

Map map = null;

ResultSetMetaData rsmd = null;

try {

rsmd = rst.getMetaData(); // 得到结果集中列类型和属性

int columnCount = rsmd.getColumnCount(); // 得到结果集中包含的列

while (rst.next()) {

map = new HashMap();

for (int i = 0; i < columnCount; i++) {

map.put((String) rsmd.getColumnName(i + 1),

rst.getString(i + 1));

}

list.add(map);

}

}catch(Exception e){

e.printStackTrace();

}

return list;

}

public static List convertObjListToMapList(List objList,Class clazz)

{

List list =new ArrayList();

Iterator itr=objList.iterator();

while(itr.hasNext())

{

Object obj=itr.next();

Map map=convertObjToMap(obj,clazz);

list.add(map);

}

return list;

}

public static Map convertObjToMap(Object obj,Class clazz)

{

Map map=new HashMap();

ObjAnalysis objAnalysis=new ObjAnalysis(obj,clazz);

map=objAnalysis.getObjPropertyMap();

return map;

}

}

4、测试代码

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import org.hibernate.bytecode.javassist.BulkAccessor;

import org.hibernate.mapping.Component;

import org.hibernate.property.BasicPropertyAccessor;

import org.hibernate.property.Getter;

import org.hibernate.tuple.component.PojoComponentTuplizer;

import net.sf.cglib.beans.BulkBean;

import test.IUser;

import test.UserImpl;

import test.entity.Address;

import test.entity.LinkType;

import test.entity.Role;

import test.entity.User;

public class TestMain {

/**

* @param args

*/

public static void main(String[] args)

{

User user=new User();

user.setUserName("abc");

user.setUserPassword("psw");

Role role=new Role();

role.setRoleId("role1");

role.setRoleName("roleName1");

user.setRole(role);

LinkType linkType=new LinkType();

Address homeAddress=new Address();

homeAddress.setAddressId("addressId1");

homeAddress.setAddressName("addressName1");

Address companyAddress=new Address();

companyAddress.setAddressId("addressId2");

companyAddress.setAddressName("addressName2");

linkType.setHomeAddress(homeAddress);

linkType.setCompanyAddress(companyAddress);

user.setLinkType(linkType);

List userList=new ArrayList();

userList.add(user);

List maplist=SqlUtil.convertObjListToMapList(userList,user.getClass());

for(int i=0;i

{

Map map=(Map)maplist.get(i);

Iterator itr=map.keySet().iterator();

while(itr.hasNext())

{

String key=itr.next().toString();

String value="";

if(map.get(key)!=null)

{

value=map.get(key).toString();

}

System.out.println(key+"="+value);

}

}

}

}

5、POJO实体类

------------------------User.java---------------------------

package test.entity;

// default package

import java.util.Date;

测试结果

linkType.homeAddress=test.entity.Address@29428e

userPassword=psw

linkType.linkTypeId=

linkType=test.entity.LinkType@d0a5d9

linkType.companyAddress=test.entity.Address@388993

linkType.homeAddress.addressId=addressId1

role.roleId=role1

linkType.homeAddress.addressName=addressName1

userId=

userName=abc

role=test.entity.Role@1d04653

linkType.companyAddress.addressId=addressId2

linkType.companyAddress.addressName=addressName2

role.roleName=roleName1

本回答由提问者推荐

2Q==

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring中,将POJO对象换为Map对象可以使用Java的反射方法和Jackson库来实现。首先,我们需要使用Java的反射方法`getDeclaredFields()`来获取POJO对象中的字段列表,包括私有字段。然后,我们可以使用Jackson库的ObjectMapper类将POJO对象换为字符串,并根据定义的格式将其换为Map对象。在这个过程中,ObjectMapper会读取POJO对象中的@JsonFormat注解,根据定义的格式进行换。以下是具体的实现代码: ```java private Map<String, Object> toMap(Object obj) { Map<String, Object> result = new HashMap<>(); Field[] fields = obj.getClass().getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); String key = field.getName(); Object value; try { value = field.get(obj); } catch (Exception e) { log.warn("取不到对象中名为 " + field.getName() + " 的值,将其置为空。", e); continue; } result.put(key, value); } return result; } ``` 这段代码中,我们首先使用`getDeclaredFields()`方法获取POJO对象中的所有字段。然后,我们通过循环遍历每个字段,将其名称作为Map中的键,并通过`field.get(obj)`方法获取该字段的值。最后,将键值对添加到结果Map中并返回。 请注意,上述代码中的日志记录是可选的,可以根据需要进行调整。同样地,这个方法也可以根据具体的需求进行调整和扩展。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [说说如何把一个POJO形式的Bean对象换为 Map形式](https://blog.csdn.net/deniro_li/article/details/117394290)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值