候鸟Anson

候鸟,随四季交替而迁徙。 我的人生,也如候鸟一般,随年龄变化而迁徙。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

最近项目中有个需求,需要从一个List中,抽取其中一个项目,生成一个新的List。因为这个操作需要对不同类型的List使用,并且抽取的项目类型也不相同。所以用泛型实现了一个比较通用的方法。下面是实现代码。

 1 //从一个List<T>中,抽出T中指定项目(E类型),返回一个List<E>
 2 //srtList 抽出源List
 3 //tClass 源List中Item的类型(T自定义类)
 4 //eClass 源List中Item类中要抽出项目的类型E(Stringd等等)
 5 //fieldName 要抽出的项目名(注意,工具里面会利用这个fieldName生成对应的get方法,所以,该类中必须有对应的Get方法)
 6 public static <T, E> List<E> extractItemFromList(List<T> srtList, Class<T> tClass, Class<E> eClass, String fieldName) {
 7     List<E> rtnList = new ArrayList<E>();
 8     Method method = null;
 9     //获得方法名 getXXX
10     String methodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
11 
12     try {
13         //通过给定的类名,生成类的实例,然后取得这个实例的指定方法名的引用。
14         method = (tClass.newInstance()).getClass().getMethod(methodName);
15     } catch (NoSuchMethodException e) {
16         e.printStackTrace();
17     } catch (InstantiationException e) {
18         e.printStackTrace();
19     } catch (IllegalAccessException e) {
20         e.printStackTrace();
21     }
22 
23     for (T t : srtList) {
24         E obj = null;
25         try {
26             //执行对象t的特定方法(前面取得的方法名method)
27             obj = (E) method.invoke(t);
28             rtnList.add(obj);
29         } catch (IllegalAccessException e) {
30             e.printStackTrace();
31         } catch (InvocationTargetException e) {
32             e.printStackTrace();
33         }
34     }
35     return rtnList;
36 }

method = (tClass.newInstance()).getClass().getMethod(methodName);

有一点需要注意取得方法名的时候,需要先生成T的一个实例,tClass.newInstance(),然后获得这个实例的类,再获得指定的方法的引用。

如果不实例化,直接tClass.getMethod的话,得不到实际的方法。如果使用tClass.getMethods的话,会得到Object类的对应方法。

 用法:

List<UserInfo> srcList;(这是源List,里面存放UserInfo,UserInfo里面有name和其他的项目)

List<String> targetList = ListUtil.getItemListFromList(srcList, UserInfo.class, String.class,"name");

posted on 2018-03-23 21:49  候鸟Anson  阅读(6322)  评论(0编辑  收藏  举报