小人菜的一B
近日写了个list转map的小的不能再小的小方法……
虽然没有派上用处,但是我感觉也挺不错的,自己的孩子再无用再磕碜只要不危害社会都是宝啊!!哇哈哈!!
package test;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 工具类-练习
* @author lemon
* @since 20130925
*/
public class Util {
public static void main(String args[]) throws SecurityException, NoSuchFieldException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
/**原谅我下面幼稚的置值,恩恩,new一个list来作为测试,里面放着Person*/
List<Person> list = new ArrayList<Person>();
Person p1 = new Person();
Person p2 = new Person();
Person p3 = new Person();
p1.setName("lanchenghao");
p1.setAge("12");
p1.setSex("男");
p3.setName("xiongxiong");
p3.setAge("12");
p3.setSex("男");
p2.setName("pengpeng");
p2.setAge("12");
p2.setSex("男");
list.add(p1);
list.add(p2);
list.add(p3);
/**进行转换,这里也可以用泛型强制转换下*/
Map map = Util.listToMap(list,"name", Person.class);
/**获取对象,并输出*/
System.out.println(((Person)map.get("pengpeng")).getAge());
/**原始思路,然后把这个方法抽象就成了下面的*/
Map<String,Person> map2 = new HashMap<String,Person>();
for(int i=0;i<list.size();i++){
map2.put(list.get(i).getName(), list.get(i));
}
}
/**
* List转Map工具方法
* 原谅我抛了那么多异常……额 仅做测试之用
* @param list 欲转换list
* @param key 指定list中对象某个属性,作为转换后map的key
* @param clazz list中作为转换后value的对象的类型
* @return Map<Object,Object> 转换后的map 返回
* @throws SecurityException
* @throws NoSuchFieldException
* @throws NoSuchMethodException
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
public static Map<Object,Object> listToMap(List<?> list,String key,Class<?> clazz) throws SecurityException, NoSuchFieldException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
Map<Object,Object> map = new HashMap<Object,Object>();//声明一个map
Class<?> classType = clazz;//获取类型
Method getter = Util.obtainGetter(classType, key);//获取getter方法
for(int i=0;i<list.size();i++){
//将指定的属性值作为key,对象最为value放入map
map.put(getter.invoke(list.get(i)), list.get(i));//invoke执行list中对象的getter方法
}
return map;
}
/**
* 获取getter方法
* @param clazz 欲进行反射获取的类
* @param key 欲获取的getter方法 这里是某一个,也可以扩展成所有的,只需要遍历该对象的所有field
* @return Method 返回方法
* @throws SecurityException
* @throws NoSuchFieldException
* @throws NoSuchMethodException
*/
public static Method obtainGetter(Class<?> clazz,String key) throws SecurityException, NoSuchFieldException, NoSuchMethodException{
Class<?> classType = clazz;//获取类
Field field = classType.getDeclaredField(key);//获取属性,Declared可以获取所有声明的属性,包括私有的,如果你用getField则只能获得public修饰的
String fieldName = field.getName();//获取属性的名称
String firstChar = fieldName.substring(0,1).toUpperCase();//getter方法 形如getName 这里是获取固定格式的大写字母
String getterName = "get"+firstChar+fieldName.substring(1);//拼装方法名称 这里的fieldName.substring(1)表示截取 从第一个之后的字符
Method getter = classType.getDeclaredMethod(getterName);//获取方法
return getter;
}
}