spring注解之反射获取方法-----list<Object> 转 List<Map>

本文介绍了如何使用Spring注解配合反射技术,将List<Object>转换为List<Map>。首先展示了获取Bean的工具类,接着详细讲解了实际应用过程,最后提供了具体的转换工具类实现。

1、获取bean 工具类


package ..........utils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * 获取bean工具类
 */

@Component
public class SpringContectUtil implements ApplicationContextAware {

    public static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContectUtil.applicationContext = applicationContext;
    }

    public static Object getBean(String name) throws BeansException {
        return applicationContext.getBean(name);
    }

}

2、具体使用


//str 为bean ID (类名首字母小写) 
Class<?> tbLoanBill = SpringContectUtil.getBean(str).getClass();
//getLisAccs 为要执行的方法名
Method getLis= tbLoanBill.getDeclaredMethod("getLis", String.class);
//参数1、str 为bean ID (类名首字母小写) ,参数2、方法的参数
List<Object> lis1 = (List<Object>) getLis.invoke(SpringContectUtil.getBean(str), tbLoanInfo.getContractNum());
 //list<Object> 转 List<Map> 
List<Map<String,Object>> divMap = listTransToMapUtils.listTransToMap(lis1);

3、list<Object> 转 List<Map> 工具类

package ......utils;

import lombok.extern.log4j.Log4j2;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@Log4j2
public class listTransToMapUtils {

    public static List<Map<String,Object>> listTransToMap(List<Object> list){
        List<Map<String,Object>> maps=new ArrayList<Map<String,Object>>();
        for(Object obj:list){
            Class c = obj.getClass();
            Field[] f = c.getDeclaredFields();
            Map<String,Object> map=new HashMap<String, Object>();
            for(Field fie : f){
                try {
                    //反射知识
                    fie.setAccessible(true);//取消语言访问检查
                    map.put(fie.getName(), fie.get(obj));//获取私有变量值
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
            //获取父类的私有属性
            for(Field fie : c.getSuperclass().getDeclaredFields()){
                try {
                    fie.setAccessible(true);//取消语言访问检查
                    map.put(fie.getName(), fie.get(obj));//获取私有变量值
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
            maps.add(map);
        }
        return maps;
    }
}
<think>我们需要将实体类的List换为List<Map<String, Object>>,其中每个Map代表一个实体对象的属性名和属性值的映射。 假设我们有一个实体类,例如: public class User { private Integer id; private String name; // 省略getter和setter } 我们要将List<User>换为List<Map<String, Object>>,每个Map对应一个User对象的属性。 步骤: 1. 遍历List中的每个实体对象。 2. 对于每个实体对象,通过反射获取其所有字段(或者通过getter方法)及其值。 3. 将字段名和对应的值放入一个Map中。 4. 将每个对象的Map添加到一个List中。 注意:这里我们使用反射获取字段,但要注意,直接获取字段可能会破坏封装(因为字段可能是private的), 另一种更安全的方式是获取getter方法。但为了简单,我们这里直接获取所有字段(包括private),并通过设置可访问来获取值。 另外,我们也可以使用一些工具库,比如Apache Commons BeanUtils或Spring的BeanUtils,但这里我们使用纯Java实现。 示例代码(Java): </think>### 实体类 List List<Map<String, Object>> 以下是使用 Java 反射实现的通用方法,适用于任何实体类: ```java import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class EntityConverter { public static <T> List<Map<String, Object>> convertToMapList(List<T> entityList) { if (entityList == null || entityList.isEmpty()) { return new ArrayList<>(); } List<Map<String, Object>> resultList = new ArrayList<>(); // 获取第一个对象的类用于提取字段(假设列表中对象类型一致) Class<?> clazz = entityList.get(0).getClass(); Field[] fields = clazz.getDeclaredFields(); for (T entity : entityList) { Map<String, Object> fieldMap = new HashMap<>(); for (Field field : fields) { try { field.setAccessible(true); // 允许访问私有字段 Object value = field.get(entity); fieldMap.put(field.getName(), value); } catch (IllegalAccessException e) { throw new RuntimeException("反射访问字段失败: " + field.getName(), e); } } resultList.add(fieldMap); } return resultList; } } ``` ### 代码解释: 1. **泛型方法**:`<T>` 支持任意实体类型 2. **反射处理**: - `clazz.getDeclaredFields()` 获取所有字段(包括私有字段) - `field.setAccessible(true)` 突破私有字段访问限制 - `field.get(entity)` 动态获取字段值 3. **映射构建**: - 字段名作为 Map 的 key (`field.getName()`) - 字段值作为 Map 的 value (`field.get(entity)`) 4. **异常处理**:捕获 `IllegalAccessException` 并换为运行时异常 ### 使用示例: ```java // 实体类 public class User { private Integer id; private String name; // 构造方法/getter/setter省略 } // 换示例 List<User> userList = new ArrayList<>(); userList.add(new User(1, "Alice")); userList.add(new User(2, "Bob")); List<Map<String, Object>> result = EntityConverter.convertToMapList(userList); ``` ### 输出结果: ```java [ {"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"} ] ``` ### 注意事项: 1. **性能考虑**:反射操作有性能开销,频繁调用时建议缓存 `Field[]` 2. **复杂对象**:不支持嵌套对象(需递归处理) 3. **字段过滤**:可通过添加注解标记需要忽略的字段 4. **空值处理**:`null` 值会被直接放入 Map
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值