一個反射的妙用案例
今天在工作中遇到一種場景:
一個表格有10個列,要求當點選某列列頭時,下拉展示該列的所有資料
解決的常規辦法是根據傳入的列引數值,判斷是哪一列,使用switch()或者if-else判斷過濾出哪一列的值
但這個辦法太臃腫,如果有100個欄位,那這個分支選擇就太大了
所以採用反射,你傳什麼列名,我就給你呼叫什麼列欄位的get方法,從結果集中過濾出目標列資料
思路:
public List<String> getColumnList (QueryVO vo){
//首先判斷傳入的代表列名的colName不能為空,因為為空就無法知道要過濾哪一列的值了
String colName = vo.getColName();
if(StringUtil.isNullOrEmpty(colName)){
throw new IsNullException("引數為空!");
}
//將傳入的列名首字母變成大寫,便於後續拼接getXxx方法
colName = colName.subString(0,1).toUpperCase() + colName.subString(1);
//查詢資料庫
List<ResultVO> users= demoDao.findListByVO(vo);
//採用反射過濾資料:首先獲取列對應的那個get方法,然後反射呼叫invoke,最後將獲得的資料裝入新list中,遍歷結束後返回結果
List<String> list = new ArrayList<String>(); Method method = User.class.getMethod("get" + vo.getColName(), Object.class); for(User user : users){ String value = (String)method.invoke(user, new Object()); list.add(value); } return list;
}
//總結:該案例的本質是通過拼接方法名稱來實現對方法的呼叫,但實現起來卻是靠反射.
使用低層方法也許能非常方便的解決一些煩擾的問題