package com.sxy.sibemanagementapi;
import com.sxy.sibemanagementapi.util.DateUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* @author 相当地主的程序猿
* @title: JavaBeanUtil
* @projectName sibemanagementapi
* @description: TODO
* @date 2019/7/1314:06
*/
public class JavaBeanUtil {
private static Logger logger = LoggerFactory.getLogger(JavaBeanUtil.class);
/**
* * 实体类转map
* * @param obj
* * @return
*
*/
public static Map<String, Object> convertBeanToMap(Object obj) {
if (obj == null) {
return null;
}
Map<String, Object> map = new HashMap<>();
try {
BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor property : propertyDescriptors) {
String key = property.getName();
// 过滤class属性
if (!key.equals("class")) {
// 得到property对应的getter方法
Method getter = property.getReadMethod();
Object value = getter.invoke(obj);
if (null == value) {
map.put(key, "");
} else {
map.put(key, value);
}
}
}
} catch (Exception e) {
logger.error("convertBean2Map Error {}", e);
}
return map;
}
/**
* * map 转实体类
* * @param clazz
* * @param map
* * @param <T>
* * @return
*
*/
public static <T> T convertMapToBean(Class<T> clazz, Map<String, Object> map) {
T obj = null;
try {
BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
obj = clazz.newInstance(); // 创建 JavaBean 对象
// 给 JavaBean 对象的属性赋值
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (int i = 0; i < propertyDescriptors.length; i++) {
PropertyDescriptor descriptor = propertyDescriptors[i];
String propertyName = descriptor.getName();
if (map.containsKey(propertyName)) {
// 下面几句可以 try 起来,这样当一个属性赋值失败的时候就不会影响其他属性赋值。
Object value = map.get(propertyName);
Object[] args = new Object[1];
String typeName = descriptor.getPropertyType().getTypeName();
try {
if (value == null){
continue;
}
if (typeName.endsWith("String")) {
if (value != null) {
value = value.toString();
}
}
if (typeName.endsWith("Date")) {
//创建SimpleDateFormat对象实例并定义好转换格式
SimpleDateFormat sdf = new SimpleDateFormat(getDateTypeStr(value.toString()));
value = sdf.parse(value.toString());
}
if (typeName.endsWith("BigDecimal")) {
value = new BigDecimal(Double.parseDouble(value.toString()));
}
if (typeName.endsWith("Boolean")) {
value = Boolean.getBoolean(value.toString());
}
if (typeName.endsWith("Integer")) {
value = new Integer(value.toString());
}
if (typeName.endsWith("Long")) {
value = new Long(value.toString());
}
args[0] = value;
descriptor.getWriteMethod().invoke(obj, args);
} catch (ParseException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
logger.error("convertMapToBean字段映射失败 Error{}", e);
}
}
}
} catch (IllegalAccessException e) {
logger.error("convertMapToBean 实例化JavaBean失败 Error{}", e);
} catch (IntrospectionException e) {
logger.error("convertMapToBean 分析类属性失败 Error{}", e);
} catch (IllegalArgumentException e) {
logger.error("convertMapToBean 映射错误 Error{}", e);
} catch (InstantiationException e) {
logger.error("convertMapToBean 实例化 JavaBean 失败 Error{}", e);
} catch (Exception e) {
logger.error("convertMapToBean Error{}", e);
}
return (T) obj;
}
private static String dateType1 = "yyyy-MM-dd";
private static String regularDateType1 = "^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$";
private static String dateType2 = "yyyy-MM-dd HH:mm:ss";
private static String regularDateType2 = "^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)\\s([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$";
private static String dateType3 = "yyyy/MM/dd";
private static String regularDateType3 = "^(?:(?!0000)[0-9]{4}/(?:(?:0?[1-9]|1[0-2])/(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])/(?:29|30)|(?:0?[13578]|1[02])/31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)/0?2/29)$";
private static String dateType4 = "yyyy/MM/dd HH:mm:ss";
private static String regularDateType4 = "^(?:(?!0000)[0-9]{4}/(?:(?:0?[1-9]|1[0-2])/(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])/(?:29|30)|(?:0?[13578]|1[02])/31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)/0?2/29)\\s([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$";
private static String dateType5 = "yyyy/MM/dd HH:mm";
private static String regularDateType5 = "^(?:(?!0000)[0-9]{4}/(?:(?:0?[1-9]|1[0-2])/(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])/(?:29|30)|(?:0?[13578]|1[02])/31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)/0?2/29)\\s([01][0-9]|2[0-3]):[0-5][0-9]$";
private static String dateType6 = "yyyyMMdd";
private static String regularDateType6 = "^(?:(?!0000)[0-9]{4}(?:(?:0?[1-9]|1[0-2])(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])(?:29|30)|(?:0?[13578]|1[02])31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)0?229)$";
private static String dateType7 = "yyyyMMddHHmmss";
private static String regularDateType7 = "^(?:(?!0000)[0-9]{4}(?:(?:0?[1-9]|1[0-2])(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])(?:29|30)|(?:0?[13578]|1[02])31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)0?229)([01][0-9]|2[0-3])[0-5][0-9][0-5][0-9]$";
public static String getDateTypeStr(String str){
if (str.matches(regularDateType1)){
return dateType1;
}
if (str.matches(regularDateType2)){
return dateType2;
}
if (str.matches(regularDateType3)){
return dateType3;
}
if (str.matches(regularDateType4)){
return dateType4;
}
if (str.matches(regularDateType5)){
return dateType5;
}
if (str.matches(regularDateType6)){
return dateType6;
}
if (str.matches(regularDateType7)){
return dateType7;
}
return null;
}
public static void main(String[] args) throws IllegalAccessException, InstantiationException {
// OriPaymentBillSupplier oriPaymentBillSupplier = OriPaymentBillSupplier.class.newInstance();
Map<String, Object> map = new HashMap<>();
map.put("id","1");
map.put("seq","10");
map.put("supplierCode","supplierCode");
map.put("totalTicketPrice","10.10");
map.put("tradeTime","2019-07-13");
OriPaymentBillSupplier oriPaymentBillSupplier = convertMapToBean(OriPaymentBillSupplier.class, map);
System.out.println(oriPaymentBillSupplier.toString());
}
static class OriPaymentBillSupplier {
private Long id;
/**
* 账单记录序号,根据导入的行号
*/
private Integer seq;
/**
* 交易时间
* */
private Date tradeTime;
/**
* 供应商名称
*/
private String supplierCode;
/**
* 总票价
*/
private BigDecimal totalTicketPrice;
@Override
public String toString() {
return "OriPaymentBillSupplier{" +
"id=" + id +
", seq=" + seq +
", tradeTime=" + tradeTime +
", supplierCode='" + supplierCode + '\'' +
", totalTicketPrice=" + totalTicketPrice +
'}';
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Integer getSeq() {
return seq;
}
public void setSeq(Integer seq) {
this.seq = seq;
}
public Date getTradeTime() {
return tradeTime;
}
public void setTradeTime(Date tradeTime) {
this.tradeTime = tradeTime;
}
public String getSupplierCode() {
return supplierCode;
}
public void setSupplierCode(String supplierCode) {
this.supplierCode = supplierCode;
}
public BigDecimal getTotalTicketPrice() {
return totalTicketPrice;
}
public void setTotalTicketPrice(BigDecimal totalTicketPrice) {
this.totalTicketPrice = totalTicketPrice;
}
}
}
Map转实体类工具类支持多种数据类型
最新推荐文章于 2023-06-30 18:41:55 发布