利用java反射將結果集封裝成為物件和物件集合
阿新 • • 發佈:2019-02-10
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;
}
}