1. 程式人生 > >利用java反射將結果集封裝成為物件和物件集合

利用java反射將結果集封裝成為物件和物件集合

java反射機制是什麼

反射機制是在執行狀態中,可以知道任何一個類的屬性和方法,並且呼叫類的屬性和方法;

反射機制能夠做什麼

1、判斷執行物件的所屬類
2、構造任意一個類的物件
3、獲取任意一個類的屬性和方法
4、呼叫任意屬性和方法
5、生成動態代理

利用反射將結果集封裝成為物件或者集合(實測可用)

package coral.base.util;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import
java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import wfc.service.database.RecordSet; public
class ReflectUtils { /** * 將一個map集合封裝成為bean物件 * * @param param * @param clazz * @return */ public static <T> T MapToBean(Map<String, Object> param, Class<?> clazz) { Object value = null; Class[] paramTypes = new Class[1]; Object obj = null
; try { obj = clazz.newInstance(); // 獲取類的屬性 Field[] declaredFields = clazz.getDeclaredFields(); // 獲取父類或介面的公有屬性 Field[] superFields = clazz.getSuperclass().getFields(); List<Field[]> list = new ArrayList<Field[]>(); if (declaredFields != null) { list.add(declaredFields); } if (superFields != null) { list.add(superFields); } for (Field[] fields : list) { for (Field field : fields) { String fieldName = field.getName(); // 獲取屬性對應的值ֵ value = param.get(fieldName); // 把值設定進入物件屬性中 這裡可能是有屬性但是沒有相應的set方法,所以要做異常處理 try { PropertyDescriptor pd = new PropertyDescriptor( fieldName, clazz); Method method = pd.getWriteMethod(); method.invoke(obj, new Object[] { value }); } catch (Exception e1) { } } } } catch (Exception e1) { } return (T) obj; } /** * 獲取類的所有屬性,包括父類和介面 * @param clazz * @return */ public static List<Field[]> getBeanFields(Class<?> clazz) { List<Field[]> list = new ArrayList<Field[]>(); Field[] declaredFields = clazz.getDeclaredFields(); Field[] superFields = clazz.getSuperclass().getFields(); if (declaredFields != null) { list.add(declaredFields); } if (superFields != null) { list.add(superFields); } return list; } /** * 從結果集中獲取出值 * @param fieldName * @param rs * @return */ public static Object getFieldValue(String fieldName, ResultSet rs) { Object value = null; try { //捕獲值不存在的異常 value = rs.getObject(fieldName); return value; } catch (SQLException e) { //oracle資料庫的列都是大寫,所以才查詢一次 fieldName = fieldName.toLowerCase(); try { value = rs.getObject(fieldName); return value; } catch (SQLException e1) { //結果集中沒有對應的值,返回為空 return null; } } } /** * 方法過載, * @param fieldName * @param rs 這個是封裝過的結果集 * @return */ public static Object getFieldValue(String fieldName, RecordSet rs) { Object value = null; value = rs.getObject(fieldName); return value; } /** * 方法過載 * @param rs 封裝過的結果集 * @param clazz * @return */ public static <T> T RSToBean(RecordSet rs, Class<?> clazz) { Object obj = null; List<Field[]> list = getBeanFields(clazz); try { obj = clazz.newInstance(); for (Field[] fields : list) { for (Field field : fields) { String fieldName = field.getName(); // String fieldName = field.getName();ֵ Object value = getFieldValue(fieldName, rs); try { PropertyDescriptor pd = new PropertyDescriptor( fieldName, clazz); Method method = pd.getWriteMethod(); method.invoke(obj, new Object[] { value }); } catch (Exception e1) { } } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return (T) obj; } /** * 把結果集封裝成為bean物件 * @param rs * @param clazz * @return */ public static <T> T RSToBean(ResultSet rs, Class<?> clazz) { Object obj = null; List<Field[]> list = getBeanFields(clazz); try { while (rs.next()) { obj = clazz.newInstance(); for (Field[] fields : list) { for (Field field : fields) { String fieldName = field.getName(); // String fieldName = field.getName();ֵ Object value = getFieldValue(fieldName, rs); PropertyDescriptor pd = new PropertyDescriptor( fieldName, clazz); Method method = pd.getWriteMethod(); method.invoke(obj, new Object[] { value }); } } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return (T) obj; } /** * 把結果集封裝成為List * * @param rs * @param clazz * @return */ public static <T> List<T> RsToList(ResultSet rs, Class<?> clazz) { ArrayList<T> objList = new ArrayList<T>(); // 獲取所有的屬性 List<Field[]> list = getBeanFields(clazz); try { while (rs.next()) { // 定義臨時變數 Object tempObeject = clazz.newInstance(); // 新增到屬性中 for (Field[] fields : list) { for (Field field : fields) { String fieldName = field.getName(); // 獲取屬性值ֵ Object value = getFieldValue(fieldName, rs); PropertyDescriptor pd = new PropertyDescriptor( fieldName, clazz); Method method = pd.getWriteMethod(); method.invoke(tempObeject, new Object[] { value }); } } objList.add((T) tempObeject); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return objList; } }