最近項目中有個需求,需要從一個List中,抽取其中一個項目,生成一個新的List。下麵是實現代碼。 method = (tClass.newInstance()).getClass().getMethod(methodName); 有一點需要註意取得方法名的時候,需要先生成T的一個實例,tClass ...
最近項目中有個需求,需要從一個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> getItemListFromList(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");