将泛型List data集合转化为数组、Map

    将泛型List data集合转化为数组的实现,一开始有两种猜想,验证后发现,只有一种可以实现。

    首先,失败的情况如下。
    直接使用 data.toArray() ,如下图,编译通过,但在运行时输出传入List 中的类名,猜想,该放法只适用于list集合中直接存储数据的情况,对象的集合转化数组的情况不适用。


图 1

以上方法的变形,也是这种情况,同样失败。如图:


图 2

    那么,利用反射的思想,可否实现呢?经过验证发现,可以实现。不过,如果使用时是按写入的顺序调用返回的数组的话没有问题(类似写入excel文件,保证传入的数据写入的顺序与表头一致即可,我就是为了满足这种需求),但假如不能确定数据的调用是按顺序时,推荐采用反射后写入Map的方法,此时,获取类的属性名为key,属性对应的值为value,调用时按key值调用即可。另外还有一种特殊情况,如果你的每一个数据的类型都不同的话,也可以采用反射成数组的形式,只不过调用数据时要按照数据类型来引用(使用 instanceof 来区分)。代码如下:

    反射成数组。

import java.lang.reflect.Field;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *  反射获取bean对应的属性的值,写入数组中并返回数组
 */
public class ReFlexObjectUtil {
    
    Logger logger = LoggerFactory.getLogger(getClass());
    
    public Object[]  getArray(Object object){       
        //得到类对象
        Class inputClass = (Class)object.getClass();        
        //得到类中所有属性集合
        Field[] fields = inputClass.getDeclaredFields();
        Object[] array = new Object[fields.length];
        //循环写入数组
        for(int i = 0; i < fields.length; i++) {
            fields[i].setAccessible(true);
            try {
                array[i] = fields[i].get(object);//获取当前值并传给数组
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        logger.debug("单个对象的所有键值反射成数组");
        
        return array;
    }
}

    反射成map。

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *  反射获取bean对应的属性名称和值,写入map中并返回map
 */
public class ReFlexObjectUtil {
    
    Logger logger = LoggerFactory.getLogger(getClass());
    
    public Map  getKeyandValue(Object object){
        
        Map map = new HashMap();     
        //得到类对象
        Class inputClass = (Class)object.getClass();        
        //得到类中所有属性集合
        Field[] fields = inputClass.getDeclaredFields();        
        //循环写入map
        for(int i = 0; i < fields.length; i++) {
            Field field = fields[i];
            field.setAccessible(true);//设置属性是可以访问的
            Object value = new Object();
            try {
                value = field.get(object);
                map.put(field.getName(), value);//将键对值写入map
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        logger.debug("单个对象的所有键值反射成Map==" + map.toString());
        return map;
    }
}

     以上,如果你有更好的方法,欢迎交流。

你可能感兴趣的:(将泛型List data集合转化为数组、Map)