将泛型List<?> data集合转化为数组的实现,一开始有两种猜想,验证后发现,只有一种可以实现。
首先,失败的情况如下。
直接使用 data.toArray() ,如下图,编译通过,但在运行时输出传入List<?> 中的类名,猜想,该放法只适用于list集合中直接存储数据的情况,对象的集合转化数组的情况不适用。
以上方法的变形,也是这种情况,同样失败。如图:
那么,利用反射的思想,可否实现呢?经过验证发现,可以实现。不过,如果使用时是按写入的顺序调用返回的数组的话没有问题(类似写入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<String, Object> getKeyandValue(Object object){
Map<String, Object> map = new HashMap<String,Object>();
//得到类对象
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;
}
}
以上,如果你有更好的方法,欢迎交流。