实战中经常碰到类1中的属性赋值给类2,但是两个类中的属性类型和大小写甚至下划线
不一致。尤其是不同语言或者不同技术做业务交互时更多。如果用spring框架
中的BeanUtils的方法会不好用,所以封装了一个工具类,如下:
注意事项:两个实体类中如果使用@Data注解是没有问题的,但是如果写原生get和set方法时必须规范。
source类中的实体必须全是小写的(后来发现的问题,已经解决,如下第二个代码类)
如果source是实体类,private static final long serialVersionUID = 4103899600927837110L;有这样的属性,那么会报错Method not found: is。。。
public class BeanUtil {
/**
* 将接口类的值复制到业务类中
*
* @param source
* 接口类
* @param target
* 业务类
* @throws Exception
*/
public static void copyPropertiesLowerCase(Object source, Object target) throws RuntimeException {
try {
Class sourceClazz = source.getClass();
Class targetClazz = target.getClass();
Field[] sourceFields = sourceClazz.getDeclaredFields();
Field[] targetFields = targetClazz.getDeclaredFields();
for (int i = 0; i < sourceFields.length; i++) {
Field sourceField = sourceFields[i];
PropertyDescriptor pdSource = new PropertyDescriptor(sourceField.getName()
.toLowerCase(),
sourceClazz);
Method rM = pdSource.getReadMethod();
Object value = rM.invoke(source);
if (value != null) {
for (int j = 0; j < targetFields.length; j++) {
Field targetField = targetFields[j];
if (sourceField.getName()
.replaceAll("_", "")
.toLowerCase()
.equals(targetField.getName()
.replaceAll("_", "")
.toLowerCase())) {
PropertyDescriptor pdTarget = new PropertyDescriptor(targetField.getName(),
targetClazz);
Method wM = pdTarget.getWriteMethod();
if ("class javax.xml.datatype.XMLGregorianCalendar".equals(sourceField.getType()
.toString())) {
if ("class java.util.Date".equals(targetField.getType()
.toString())) {
wM.invoke(target,
((XMLGregorianCalendar) value).toGregorianCalendar()
.getTime());
}
else if ("class javax.xml.datatype.XMLGregorianCalendar".equals(targetField.getType()
.toString())) {
wM.invoke(target,
(XMLGregorianCalendar) value);
}
}
else if ("class java.math.BigDecimal".equals(sourceField.getType()
.toString())) {
if ("class java.lang.Long".equals(targetField.getType()
.toString())) {
wM.invoke(target,
((BigDecimal) value).longValue());
}
else if ("class java.math.BigDecimal".equals(targetField.getType()
.toString())) {
wM.invoke(target, (BigDecimal) value);
}
else if ("class java.lang.Double".equals(targetField.getType()
.toString())) {
wM.invoke(target,
Double.valueOf(value.toString()));
}
else if ("class java.lang.String".equals(targetField.getType()
.toString())) {
wM.invoke(target,
String.valueOf(value.toString()));
}
}
else if (sourceField.getType()
.toString()
.equals(targetField.getType()
.toString())) {
wM.invoke(target, value);
}
else if ("class java.lang.Double".equals(sourceField.getType()
.toString())) {
if ("class java.math.BigDecimal".equals(targetField.getType()
.toString())) {
wM.invoke(target,
(BigDecimal.valueOf((Double) value)));
}
else {
wM.invoke(target, (Double) value);
}
}
else if ("class java.lang.Long".equals(sourceField.getType()
.toString())) {
if ("class java.math.BigDecimal".equals(targetField.getType()
.toString())) {
wM.invoke(target,
new BigDecimal((Long) value));
}
else {
wM.invoke(target, (Long) value);
}
}
else if ("class java.util.Date".equals(sourceField.getType()
.toString())) {
if ("class java.util.Date".equals(targetField.getType()
.toString())) {
wM.invoke(target, (Date) value);
}
else if ("class javax.xml.datatype.XMLGregorianCalendar".equals(targetField.getType()
.toString())) {
wM.invoke(target,
XmlDateUtill.convertToXMLGregorianCalendar((Date) value));
}
}
}
}
}
}
}
catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
}
}
source类中的属性可以不全是小写
public class BeanUtil {
public static void copyProperties(Object source, Object target) throws RuntimeException {
try {
Class sourceClazz = source.getClass();
Class targetClazz = target.getClass();
Field[] sourceFields = sourceClazz.getDeclaredFields();
Field[] targetFields = targetClazz.getDeclaredFields();
for (int i = 0; i < sourceFields.length; i++) {
Field sourceField = sourceFields[i];
PropertyDescriptor pdSource = new PropertyDescriptor(sourceField.getName()
.toUpperCase(),
sourceClazz);
Method rM = pdSource.getReadMethod();
Object value = rM.invoke(source);
if (value != null) {
for (int j = 0; j < targetFields.length; j++) {
Field targetField = targetFields[j];
if (sourceField.getName()
.replaceAll("_", "")
.toLowerCase()
.equals(targetField.getName()
.replaceAll("_", "")
.toLowerCase())) {
PropertyDescriptor pdTarget = new PropertyDescriptor(targetField.getName()
.toUpperCase(),
targetClazz);
Method wM = pdTarget.getWriteMethod();
if ("class javax.xml.datatype.XMLGregorianCalendar".equals(sourceField.getType()
.toString())) {
if ("class java.util.Date".equals(targetField.getType()
.toString())) {
wM.invoke(target,
((XMLGregorianCalendar) value).toGregorianCalendar()
.getTime());
}
else if ("class javax.xml.datatype.XMLGregorianCalendar".equals(targetField.getType()
.toString())) {
wM.invoke(target,
(XMLGregorianCalendar) value);
}
}
else if ("class java.math.BigDecimal".equals(sourceField.getType()
.toString())) {
if ("class java.lang.Long".equals(targetField.getType()
.toString())) {
wM.invoke(target,
((BigDecimal) value).longValue());
}
else if ("class java.math.BigDecimal".equals(targetField.getType()
.toString())) {
wM.invoke(target, (BigDecimal) value);
}
else if ("class java.lang.Double".equals(targetField.getType()
.toString())) {
wM.invoke(target,
Double.valueOf(value.toString()));
}
}
else if (sourceField.getType()
.toString()
.equals(targetField.getType()
.toString())) {
wM.invoke(target, value);
}
else if ("class java.lang.Double".equals(sourceField.getType()
.toString())) {
if ("class java.math.BigDecimal".equals(targetField.getType()
.toString())) {
wM.invoke(target,
(BigDecimal.valueOf((Double) value)));
}
else {
wM.invoke(target, (Double) value);
}
}
else if ("class java.lang.Long".equals(sourceField.getType()
.toString())) {
if ("class java.math.BigDecimal".equals(targetField.getType()
.toString())) {
wM.invoke(target,
new BigDecimal((Long) value));
}
else {
wM.invoke(target, (Long) value);
}
}
else if ("class java.util.Date".equals(sourceField.getType()
.toString())) {
if ("class java.util.Date".equals(targetField.getType()
.toString())) {
wM.invoke(target, (Date) value);
}
else if ("class javax.xml.datatype.XMLGregorianCalendar".equals(targetField.getType()
.toString())) {
wM.invoke(target,
XmlDateUtill.convertToXMLGregorianCalendar((Date) value));
}
}
}
}
}
}
}
catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
}
/**
* 将接口类的值复制到业务类中
*
* @param source
* 接口类
* @param target
* 业务类
* @throws Exception
*/
public static void copyPropertiesLowerCase(Object source, Object target) throws RuntimeException {
try {
Class sourceClazz = source.getClass();
Class targetClazz = target.getClass();
Field[] sourceFields = sourceClazz.getDeclaredFields();
Field[] targetFields = targetClazz.getDeclaredFields();
for (int i = 0; i < sourceFields.length; i++) {
Field sourceField = sourceFields[i];
PropertyDescriptor pdSource = new PropertyDescriptor(sourceField.getName(),
sourceClazz);
Method rM = pdSource.getReadMethod();
Object value = rM.invoke(source);
if (value != null) {
for (int j = 0; j < targetFields.length; j++) {
Field targetField = targetFields[j];
if (sourceField.getName()
.replaceAll("_", "")
.toLowerCase()
.equals(targetField.getName()
.replaceAll("_", "")
.toLowerCase())) {
PropertyDescriptor pdTarget = new PropertyDescriptor(targetField.getName(),
targetClazz);
Method wM = pdTarget.getWriteMethod();
if ("class javax.xml.datatype.XMLGregorianCalendar".equals(sourceField.getType()
.toString())) {
if ("class java.util.Date".equals(targetField.getType()
.toString())) {
wM.invoke(target,
((XMLGregorianCalendar) value).toGregorianCalendar()
.getTime());
}
else if ("class javax.xml.datatype.XMLGregorianCalendar".equals(targetField.getType()
.toString())) {
wM.invoke(target,
(XMLGregorianCalendar) value);
}
}
else if ("class java.math.BigDecimal".equals(sourceField.getType()
.toString())) {
if ("class java.lang.Long".equals(targetField.getType()
.toString())) {
wM.invoke(target,
((BigDecimal) value).longValue());
}
else if ("class java.math.BigDecimal".equals(targetField.getType()
.toString())) {
wM.invoke(target, (BigDecimal) value);
}
else if ("class java.lang.Double".equals(targetField.getType()
.toString())) {
wM.invoke(target,
Double.valueOf(value.toString()));
}
else if ("class java.lang.String".equals(targetField.getType()
.toString())) {
wM.invoke(target,
String.valueOf(value.toString()));
}
}
else if (sourceField.getType()
.toString()
.equals(targetField.getType()
.toString())) {
wM.invoke(target, value);
}
else if ("class java.lang.Double".equals(sourceField.getType()
.toString())) {
if ("class java.math.BigDecimal".equals(targetField.getType()
.toString())) {
wM.invoke(target,
(BigDecimal.valueOf((Double) value)));
}
else {
wM.invoke(target, (Double) value);
}
}
else if ("class java.lang.Long".equals(sourceField.getType()
.toString())) {
if ("class java.math.BigDecimal".equals(targetField.getType()
.toString())) {
wM.invoke(target,
new BigDecimal((Long) value));
}
else {
wM.invoke(target, (Long) value);
}
}
else if ("class java.util.Date".equals(sourceField.getType()
.toString())) {
if ("class java.util.Date".equals(targetField.getType()
.toString())) {
wM.invoke(target, (Date) value);
}
else if ("class javax.xml.datatype.XMLGregorianCalendar".equals(targetField.getType()
.toString())) {
wM.invoke(target,
XmlDateUtill.convertToXMLGregorianCalendar((Date) value));
}
}
else if ("class java.lang.String".equals(sourceField.getType()
.toString())) {
if ("class java.util.Date".equals(targetField.getType()
.toString())) {
wM.invoke(target, (Date) value);
}
if ("class java.math.BigDecimal".equals(targetField.getType()
.toString())) {
wM.invoke(target, new BigDecimal(value.toString()));
}
}
}
}
}
}
}
catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
}
}