分为两部分:1.传递数据内容(加了分页功能),2.拿到数据,使用自定义xml中的查询方法获取数据,再用辅助工具类处理,调用下载方法进行下载。
下面用jsp页面为例来获取列表数据。
filter是自定义的传值方式,用它将品牌名称的查询条件带到后台,实现维度筛选进行分页。
品牌名称:
然后说说控制层是接到数据后怎样处理的:
queryList方法中的selectList为xml中的查询方法,params里就是刚刚说的filter传过来的查询内容了。
/**
* excel导出
*/
public void exportExcel(){
try {
if(getDefaultOrderBy()==null)
throw new Exception("getDefaultOrderBy() not impl");
Map params = ParamUtils.build(getDefaultOrderBy());
LoginUser loginUser = SessionAuth.getLocalLoginUser();
boolean superAdmin = SystemUtil.isSuperAdmin(Integer.valueOf(loginUser.getIsManager()));
if(!superAdmin){ // 非超级管理员,只能查看当前单位或者当前单位下的数据(数据过滤),根据所属角色是否包含下级来决定
params.put("deptCodeFilter",loginUser.getDeptCodeFilter());
params.put("isIncluded", loginUser.getIncludeLowerLvl());//是否包含本级和下级
}
List productSupervisions = productSupervisionService.queryList("ProductSupervision.selectList", params);
String fileName = "***.xls";
ExcelUtil.ExcelModel excelModel = new ExcelUtil.ExcelModel();
String[] fieldNames = {"","","","","","","","",""}; //数据库映射字段
String[] headNames = {"","","","","","","","",""}; //中文标题字段
excelModel.setFieldNames(fieldNames);
excelModel.setHeadNames(headNames);
excelModel.setDatas(productSupervisions);
ExcelUtil.export2Excel(excelModel, response, fileName);
} catch (Exception e){
logger.error("【***数据excel导出失败】", e);
}
}
上面方法中调用到的工具类。
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellRangeAddress;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import com.xmmy.common.util.file.excel.DataFormatter;
import com.xmmy.common.util.file.excel.ReflectionUtils;
/**
* 数据导出到Excel
*/
@SuppressWarnings("deprecation")
public class ExcelUtil {
private static HSSFWorkbook wb;
private static CellStyle titleStyle; // 标题行样式
private static Font titleFont; // 标题行字体
private static CellStyle dateStyle; // 日期行样式
private static Font dateFont; // 日期行字体
private static CellStyle headStyle; // 表头行样式
private static Font headFont; // 表头行字体
private static CellStyle contentStyle; // 内容行样式
private static Font contentFont; // 内容行字体
public static void export2Excel(ExcelModel excelModel, HttpServletResponse response, String fileName)
throws IOException, IllegalAccessException {
export2Excel(excelModel.getFieldNames(), excelModel.getHeadNames(), excelModel.getDataFormatters(),
excelModel.getDatas(), response, fileName);
}
/**
* 导出Excel
*
* @param fieldNames
* @param headNames
* @param datas
* @return
* @throws IOException
* @throws IllegalAccessException
*/
public static void export2Excel(String[] fieldNames, String[] headNames, DataFormatter[] formatters, List datas,
HttpServletResponse response, String fileName) throws IOException, IllegalAccessException {
// 标题名
List head = new ArrayList();
head.add(headNames);
// 对应的列名
List field = new ArrayList();
field.add(fieldNames);
// 对应的格式化
List dataFormatters = new ArrayList<>();
dataFormatters.add(formatters);
ExcelUtil.ExportSetInfo setInfo = new ExcelUtil.ExportSetInfo();
LinkedHashMap map = new LinkedHashMap();
map.put("sheet1", datas);
setInfo.setObjsMap(map);
setInfo.setFieldNames(field);
setInfo.setTitles(new String[] { "sheet1" });
setInfo.setHeadNames(head);
setInfo.setDataFormatters(dataFormatters);
// 将需要导出的数据输出到baos
ExcelUtil.export2Excel(setInfo, response, fileName);
}
/**
* @throws IllegalAccessException
* @throws IllegalArgumentException
* @Description: 将Map里的集合对象数据输出Excel数据流
*/
@SuppressWarnings({ "unchecked" })
public static void export2Excel(ExportSetInfo setInfo, HttpServletResponse response, String fileName)
throws IOException, IllegalArgumentException, IllegalAccessException {
init();
Set> set = setInfo.getObjsMap().entrySet();
String[] sheetNames = new String[setInfo.getObjsMap().size()];
int sheetNameNum = 0;
for (Entry entry : set) {
sheetNames[sheetNameNum] = entry.getKey();
sheetNameNum++;
}
HSSFSheet[] sheets = getSheets(setInfo.getObjsMap().size(), sheetNames);
int sheetNum = 0;
for (Entry entry : set) {
// Sheet
List objs = entry.getValue();
// 标题行
// createTableTitleRow(setInfo, sheets, sheetNum);
// 日期行
// createTableDateRow(setInfo, sheets, sheetNum);
// 表头
creatTableHeadRow(setInfo, sheets, sheetNum);
// 表体
String[] fieldNames = setInfo.getFieldNames().get(sheetNum);
DataFormatter[] formatters = setInfo.getDataFormatters().get(sheetNum);
int rowNum = 1;
for (Object obj : objs) {
HSSFRow contentRow = sheets[sheetNum].createRow(rowNum);
contentRow.setHeight((short) 300);
HSSFCell[] cells = getCells(contentRow, setInfo.getFieldNames().get(sheetNum).length);
int cellNum = 1; // 去掉一列序号,因此从1开始
if (fieldNames != null) {
for (int num = 0; num < fieldNames.length; num++) {
Object value = ReflectionUtils.invokeGetterMethod(obj, fieldNames[num]);
if (formatters == null || formatters[num] == null)
cells[cellNum].setCellValue(value == null ? "" : value.toString());
else
cells[cellNum].setCellValue(value == null ? "" : formatters[num].formatter(value));
cellNum++;
}
}
rowNum++;
}
// adjustColumnSize(sheets, sheetNum, fieldNames); // 自动调整列宽
sheetNum++;
}
setResponseHeader(response, fileName);
OutputStream os = response.getOutputStream();
wb.write(os);
os.flush();
os.close();
}
public static void setResponseHeader(HttpServletResponse response, String fileName) {
try {
try {
fileName = new String(fileName.getBytes(), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
response.setContentType("application/octet-stream;charset=ISO8859-1");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
response.addHeader("Pargam", "no-cache");
response.addHeader("Cache-Control", "no-cache");
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* @Description: 初始化
*/
private static void init() {
wb = new HSSFWorkbook();
titleFont = wb.createFont();
titleStyle = wb.createCellStyle();
dateStyle = wb.createCellStyle();
dateFont = wb.createFont();
headStyle = wb.createCellStyle();
headFont = wb.createFont();
contentStyle = wb.createCellStyle();
contentFont = wb.createFont();
initTitleCellStyle();
initTitleFont();
initDateCellStyle();
initDateFont();
initHeadCellStyle();
initHeadFont();
initContentCellStyle();
initContentFont();
}
/**
* @Description: 自动调整列宽
*/
@SuppressWarnings("unused")
private static void adjustColumnSize(HSSFSheet[] sheets, int sheetNum, String[] fieldNames) {
for (int i = 0; i < fieldNames.length + 1; i++) {
sheets[sheetNum].autoSizeColumn(i, true);
}
}
/**
* @Description: 创建标题行(需合并单元格)
*/
private static void createTableTitleRow(ExportSetInfo setInfo, HSSFSheet[] sheets, int sheetNum) {
CellRangeAddress titleRange = new CellRangeAddress(0, 0, 0, setInfo.getFieldNames().get(sheetNum).length);
sheets[sheetNum].addMergedRegion(titleRange);
HSSFRow titleRow = sheets[sheetNum].createRow(0);
titleRow.setHeight((short) 800);
HSSFCell titleCell = titleRow.createCell(0);
titleCell.setCellStyle(titleStyle);
titleCell.setCellValue(setInfo.getTitles()[sheetNum]);
}
/**
* @Description: 创建日期行(需合并单元格)
*/
private static void createTableDateRow(ExportSetInfo setInfo, HSSFSheet[] sheets, int sheetNum) {
CellRangeAddress dateRange = new CellRangeAddress(1, 1, 0, setInfo.getFieldNames().get(sheetNum).length);
sheets[sheetNum].addMergedRegion(dateRange);
HSSFRow dateRow = sheets[sheetNum].createRow(1);
dateRow.setHeight((short) 350);
HSSFCell dateCell = dateRow.createCell(0);
dateCell.setCellStyle(dateStyle);
dateCell.setCellValue(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
}
/**
* @Description: 创建表头行(需合并单元格)
*/
private static void creatTableHeadRow(ExportSetInfo setInfo, HSSFSheet[] sheets, int sheetNum) {
// 表头
HSSFSheet sheet = sheets[sheetNum];
HSSFRow headRow = sheet.createRow(0);
headRow.setHeight((short) 350);
// 序号列
HSSFCell snCell = headRow.createCell(0);
snCell.setCellStyle(headStyle);
snCell.setCellValue("序号");
// sheet.setColumnWidth(0, 1000);
// 列头名称
for (int num = 1, len = setInfo.getHeadNames().get(sheetNum).length; num <= len; num++) {
HSSFCell headCell = headRow.createCell(num);
headCell.setCellStyle(headStyle);
headCell.setCellValue(setInfo.getHeadNames().get(sheetNum)[num - 1]);
sheet.setColumnWidth(num, 6000);
}
}
/**
* @Description: 创建所有的Sheet
*/
private static HSSFSheet[] getSheets(int num, String[] names) {
HSSFSheet[] sheets = new HSSFSheet[num];
for (int i = 0; i < num; i++) {
sheets[i] = wb.createSheet(names[i]);
}
return sheets;
}
/**
* @Description: 创建内容行的每一列(附加一列序号)
*/
private static HSSFCell[] getCells(HSSFRow contentRow, int num) {
HSSFCell[] cells = new HSSFCell[num + 1];
for (int i = 0, len = cells.length; i < len; i++) {
cells[i] = contentRow.createCell(i);
cells[i].setCellStyle(contentStyle);
}
// 设置序号列值,因为出去标题行和日期行,所有-2
// cells[0].setCellValue(contentRow.getRowNum() - 2);
cells[0].setCellValue(contentRow.getRowNum());
return cells;
}
/**
* @Description: 初始化标题行样式
*/
private static void initTitleCellStyle() {
titleStyle.setAlignment(CellStyle.ALIGN_CENTER);
titleStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
titleStyle.setFont(titleFont);
// titleStyle.setFillBackgroundColor(IndexedColors.SKY_BLUE.index);
}
/**
* @Description: 初始化日期行样式
*/
private static void initDateCellStyle() {
dateStyle.setAlignment(CellStyle.ALIGN_CENTER_SELECTION);
dateStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
dateStyle.setFont(dateFont);
// dateStyle.setFillBackgroundColor(IndexedColors.SKY_BLUE.index);
}
/**
* @Description: 初始化表头行样式
*/
private static void initHeadCellStyle() {
headStyle.setAlignment(CellStyle.ALIGN_CENTER);
headStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
headStyle.setFont(headFont);
headStyle.setFillBackgroundColor(IndexedColors.YELLOW.index);
headStyle.setBorderTop(CellStyle.BORDER_MEDIUM);
headStyle.setBorderBottom(CellStyle.BORDER_THIN);
headStyle.setBorderLeft(CellStyle.BORDER_THIN);
headStyle.setBorderRight(CellStyle.BORDER_THIN);
// headStyle.setTopBorderColor(IndexedColors.BLUE.index);
// headStyle.setBottomBorderColor(IndexedColors.BLUE.index);
// headStyle.setLeftBorderColor(IndexedColors.BLUE.index);
// headStyle.setRightBorderColor(IndexedColors.BLUE.index);
}
/**
* @Description: 初始化内容行样式
*/
private static void initContentCellStyle() {
contentStyle.setAlignment(CellStyle.ALIGN_CENTER);
contentStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
contentStyle.setFont(contentFont);
contentStyle.setBorderTop(CellStyle.BORDER_THIN);
contentStyle.setBorderBottom(CellStyle.BORDER_THIN);
contentStyle.setBorderLeft(CellStyle.BORDER_THIN);
contentStyle.setBorderRight(CellStyle.BORDER_THIN);
// contentStyle.setTopBorderColor(IndexedColors.BLUE.index);
// contentStyle.setBottomBorderColor(IndexedColors.BLUE.index);
// contentStyle.setLeftBorderColor(IndexedColors.BLUE.index);
// contentStyle.setRightBorderColor(IndexedColors.BLUE.index);
// contentStyle.setWrapText(true); // 字段换行
}
/**
* @Description: 初始化标题行字体
*/
private static void initTitleFont() {
titleFont.setFontName("华文楷体");
titleFont.setFontHeightInPoints((short) 20);
titleFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
titleFont.setCharSet(Font.DEFAULT_CHARSET);
// titleFont.setColor(IndexedColors.BLUE_GREY.index);
}
/**
* @Description: 初始化日期行字体
*/
private static void initDateFont() {
dateFont.setFontName("隶书");
dateFont.setFontHeightInPoints((short) 10);
dateFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
dateFont.setCharSet(Font.DEFAULT_CHARSET);
// dateFont.setColor(IndexedColors.BLUE_GREY.index);
}
/**
* @Description: 初始化表头行字体
*/
private static void initHeadFont() {
headFont.setFontName("宋体");
headFont.setFontHeightInPoints((short) 10);
headFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
headFont.setCharSet(Font.DEFAULT_CHARSET);
// headFont.setColor(IndexedColors.BLUE_GREY.index);
}
/**
* @Description: 初始化内容行字体
*/
private static void initContentFont() {
contentFont.setFontName("宋体");
contentFont.setFontHeightInPoints((short) 10);
contentFont.setBoldweight(Font.BOLDWEIGHT_NORMAL);
contentFont.setCharSet(Font.DEFAULT_CHARSET);
// contentFont.setColor(IndexedColors.BLUE_GREY.index);
}
/**
* @Description: 封装Excel导出的设置信息
*/
public static class ExportSetInfo {
@SuppressWarnings("unchecked")
private LinkedHashMap objsMap;
private String[] titles;
private List headNames;
private List fieldNames;
private List dataFormatters;
private OutputStream out;
@SuppressWarnings("unchecked")
public LinkedHashMap getObjsMap() {
return objsMap;
}
/**
* @param objsMap
* 导出数据
*
* 泛型 String : 代表sheet名称 List : 代表单个sheet里的所有行数据
*/
@SuppressWarnings("unchecked")
public void setObjsMap(LinkedHashMap objsMap) {
this.objsMap = objsMap;
}
public List getFieldNames() {
return fieldNames;
}
public void setFieldNames(List fieldNames) {
this.fieldNames = fieldNames;
}
public String[] getTitles() {
return titles;
}
/**
* @param titles
* 对应每个sheet里的标题,即顶部大字
*/
public void setTitles(String[] titles) {
this.titles = titles;
}
public List getHeadNames() {
return headNames;
}
/**
* @param headNames
* 对应每个页签的表头的每一列的名称
*/
public void setHeadNames(List headNames) {
this.headNames = headNames;
}
public OutputStream getOut() {
return out;
}
/**
* @param out
* Excel数据将输出到该输出流
*/
public void setOut(OutputStream out) {
this.out = out;
}
public List getDataFormatters() {
return dataFormatters;
}
public void setDataFormatters(List dataFormatters) {
this.dataFormatters = dataFormatters;
}
}
public static class ExcelModel {
private String[] fieldNames;
private String[] headNames;
private DataFormatter[] dataFormatters;
private List datas;
public DataFormatter[] getDataFormatters() {
return dataFormatters;
}
public void setDataFormatters(DataFormatter[] dataFormatters) {
this.dataFormatters = dataFormatters;
}
public String[] getFieldNames() {
return fieldNames;
}
public void setFieldNames(String[] fieldNames) {
this.fieldNames = fieldNames;
}
public String[] getHeadNames() {
return headNames;
}
public void setHeadNames(String[] headNames) {
this.headNames = headNames;
}
public List getDatas() {
return datas;
}
public void setDatas(List datas) {
this.datas = datas;
}
}
}
/**
* 反射工具类.
*
* 提供访问私有变量,获取泛型类型Class, 提取集合中元素的属性, 转换字符串到对象等Util函数.
*/
public class ReflectionUtils {
private static Log logger = LogFactory.getLog(ReflectionUtils.class);
static {
DateLocaleConverter dc = new DateLocaleConverter();
// dc.setPatterns(new String[] { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss" });
ConvertUtils.register(dc, Date.class);
}
/**
* 调用Getter方法.
*/
public static Object invokeGetterMethod(Object target, String propertyName) {
String getterMethodName = "get" + StringUtils.capitalize(propertyName);
return invokeMethod(target, getterMethodName, new Class[]{}, new Object[]{});
}
/**
* 调用Setter方法.使用value的Class来查找Setter方法.
*/
public static void invokeSetterMethod(Object target, String propertyName, Object value) {
invokeSetterMethod(target, propertyName, value, null);
}
/**
* 调用Setter方法.
*
* @param propertyType 用于查找Setter方法,为空时使用value的Class替代.
*/
public static void invokeSetterMethod(Object target, String propertyName, Object value, Class> propertyType) {
Class> type = propertyType != null ? propertyType : value.getClass();
String setterMethodName = "set" + StringUtils.capitalize(propertyName);
invokeMethod(target, setterMethodName, new Class[]{type}, new Object[]{value});
}
/**
* 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数.
*/
public static Object getFieldValue(final Object object, final String fieldName) {
Field field = getDeclaredField(object, fieldName);
if (field == null) {
throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + object + "]");
}
makeAccessible(field);
Object result = null;
try {
result = field.get(object);
} catch (IllegalAccessException e) {
logger.error("不可能抛出的异常{}" + e.getMessage());
}
return result;
}
/**
* 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数.
*/
public static void setFieldValue(final Object object, final String fieldName, final Object value) {
Field field = getDeclaredField(object, fieldName);
if (field == null) {
throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + object + "]");
}
makeAccessible(field);
try {
field.set(object, value);
} catch (IllegalAccessException e) {
logger.error("不可能抛出的异常:{}" + e.getMessage());
}
}
/**
* 直接调用对象方法, 无视private/protected修饰符.
*/
public static Object invokeMethod(final Object object, final String methodName, final Class>[] parameterTypes, final Object[] parameters) {
Method method = getDeclaredMethod(object, methodName, parameterTypes);
if (method == null) {
throw new IllegalArgumentException("Could not find method [" + methodName + "] parameterType " + parameterTypes + " on target [" + object + "]");
}
method.setAccessible(true);
try {
return method.invoke(object, parameters);
} catch (Exception e) {
throw convertReflectionExceptionToUnchecked(e);
}
}
/**
* 循环向上转型, 获取对象的DeclaredField.
*
* 如向上转型到Object仍无法找到, 返回null.
*/
protected static Field getDeclaredField(final Object object, final String fieldName) {
Assert.notNull(object, "object不能为空");
Assert.hasText(fieldName, "fieldName");
for (Class> superClass = object.getClass(); superClass != Object.class; superClass = superClass
.getSuperclass()) {
try {
return superClass.getDeclaredField(fieldName);
} catch (NoSuchFieldException e) {// NOSONAR
// Field不在当前类定义,继续向上转型
}
}
return null;
}
/**
* 强行设置Field可访问.
*/
protected static void makeAccessible(final Field field) {
if (!Modifier.isPublic(field.getModifiers())
|| !Modifier.isPublic(field.getDeclaringClass().getModifiers())) {
field.setAccessible(true);
}
}
/**
* 循环向上转型, 获取对象的DeclaredMethod.
*
* 如向上转型到Object仍无法找到, 返回null.
*/
protected static Method getDeclaredMethod(Object object, String methodName, Class>[] parameterTypes) {
Assert.notNull(object, "object不能为空");
for (Class> superClass = object.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) {
try {
return superClass.getDeclaredMethod(methodName, parameterTypes);
} catch (NoSuchMethodException e) {// NOSONAR
// Method不在当前类定义,继续向上转型
}
}
return null;
}
/**
* 通过反射, 获得Class定义中声明的父类的泛型参数的类型. 如无法找到, 返回Object.class. eg. public UserDao
* extends HibernateDao
*
* @param clazz The class to introspect
* @return the first generic declaration, or Object.class if cannot be
* determined
*/
@SuppressWarnings("unchecked")
public static Class getSuperClassGenricType(final Class clazz) {
return getSuperClassGenricType(clazz, 0);
}
/**
* 通过反射, 获得定义Class时声明的父类的泛型参数的类型. 如无法找到, 返回Object.class.
*
* 如public UserDao extends HibernateDao
*
* @param clazz clazz The class to introspect
* @param index the Index of the generic ddeclaration,start from 0.
* @return the index generic declaration, or Object.class if cannot be
* determined
*/
@SuppressWarnings("unchecked")
public static Class getSuperClassGenricType(final Class clazz, final int index) {
Type genType = clazz.getGenericSuperclass();
if (!(genType instanceof ParameterizedType)) {
logger.warn(clazz.getSimpleName() + "'s superclass not ParameterizedType");
return Object.class;
}
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
if (index >= params.length || index < 0) {
logger.warn("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: " + params.length);
return Object.class;
}
if (!(params[index] instanceof Class)) {
logger.warn(clazz.getSimpleName() + " not set the actual class on superclass generic parameter");
return Object.class;
}
return (Class) params[index];
}
/**
* 提取集合中的对象的属性(通过getter函数), 组合成List.
*
* @param collection 来源集合.
* @param propertyName 要提取的属性名.
*/
@SuppressWarnings("unchecked")
public static List convertElementPropertyToList(final Collection collection, final String propertyName) {
List list = new ArrayList();
try {
for (Object obj : collection) {
list.add(PropertyUtils.getProperty(obj, propertyName));
}
} catch (Exception e) {
throw convertReflectionExceptionToUnchecked(e);
}
return list;
}
/**
* 提取集合中的对象的属性(通过getter函数), 组合成由分割符分隔的字符串.
*
* @param collection 来源集合.
* @param propertyName 要提取的属性名.
* @param separator 分隔符.
*/
@SuppressWarnings("unchecked")
public static String convertElementPropertyToString(final Collection collection, final String propertyName, final String separator) {
List list = convertElementPropertyToList(collection, propertyName);
return StringUtils.join(list, separator);
}
/**
* 转换字符串到相应类型.
*
* @param value 待转换的字符串
* @param toType 转换目标类型
*/
@SuppressWarnings("unchecked")
public static T convertStringToObject(String value, Class toType) {
try {
return (T) ConvertUtils.convert(value, toType);
} catch (Exception e) {
throw convertReflectionExceptionToUnchecked(e);
}
}
/**
* 将反射时的checked exception转换为unchecked exception.
*/
public static RuntimeException convertReflectionExceptionToUnchecked(Exception e) {
return convertReflectionExceptionToUnchecked(null, e);
}
public static RuntimeException convertReflectionExceptionToUnchecked(String desc, Exception e) {
desc = (desc == null) ? "Unexpected Checked Exception." : desc;
if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException || e instanceof NoSuchMethodException) {
return new IllegalArgumentException(desc, e);
} else if (e instanceof InvocationTargetException) {
return new RuntimeException(desc, ((InvocationTargetException) e).getTargetException());
} else if (e instanceof RuntimeException) {
return (RuntimeException) e;
}
return new RuntimeException(desc, e);
}
public static final T getNewInstance(Class cls) {
try {
return cls.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
/**
* 拷贝 source 指定的porperties 属性 到 dest中
*
* @return void
* @throws java.lang.reflect.InvocationTargetException
* @throws IllegalAccessException
*/
public static void copyPorperties(Object dest, Object source, String[] porperties) throws InvocationTargetException, IllegalAccessException {
for (String por : porperties) {
Object srcObj = invokeGetterMethod(source, por);
logger.debug("属性名:" + por + "------------- 属性值:" + srcObj);
if (srcObj != null) {
try {
BeanUtils.setProperty(dest, por, srcObj);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
throw e;
} catch (InvocationTargetException e) {
throw e;
}
}
}
}
/**
* 两者属性名一致时,拷贝source里的属性到dest里
*
* @return void
* @throws IllegalAccessException
* @throws java.lang.reflect.InvocationTargetException
*/
@SuppressWarnings("unchecked")
public static void copyPorperties(Object dest, Object source) throws IllegalAccessException, InvocationTargetException {
Class srcCla = source.getClass();
Field[] fsF = srcCla.getDeclaredFields();
for (Field s : fsF) {
String name = s.getName();
Object srcObj = invokeGetterMethod(source, name);
try {
BeanUtils.setProperty(dest, name, srcObj);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
throw e;
} catch (InvocationTargetException e) {
throw e;
}
}
// BeanUtils.copyProperties(dest, orig);
}
}