一. 编写实体类
package com.test.domain;
public class Xzqgk {
/**
* 行政区代码
*/
private String xzqdm;
/**
* 行政区名称
*/
private String xzqmc;
/**
* 行政区地理环境
*/
private String xzqdlhj;
/**
* 行政区图片(链接)
*/
private String xzqtp;
/**
* 行政区行政区划
*/
private String xzqxzqh;
/**
* 矿产资源简介
*/
private String kczyjj;
/**
* 地质环境简介
*/
private String dzhjjj;
/**
* 淡水资源简介
*/
private String dszyjj;
/**
* 湿地资源简介
*/
private String sdzyjj;
/**
* 经济发展简介
*/
private String jjfzjj;
/**
* 人文历史-方言
*/
private String rwlsfy;
/**
* 人文历史-饮食
*/
private String rwlsys;
/**
* 人文历史-文物古迹
*/
private String rwlswwgj;
/**
* 人文历史-风景名胜
*/
private String rwlsfjms;
// getter&setter
}
二. 编写枚举类
package com.test.emun;
public enum XzqgkEnum {
xzqdm("行政区代码"),
xzqmc("行政区名称"),
xzqdlhj( "行政区地理环境"),
xzqtp("行政区图片"),
xzqxzqh( "行政区行政区划"),
kczyjj( "矿产资源简介"),
dzhjjj( "地质环境简介"),
dszyjj( "淡水资源简介"),
sdzyjj( "湿地资源简介"),
jjfzjj( "经济发展简介"),
rwlsfy( "人文历史方言"),
rwlsys( "人文历史饮食"),
rwlswwgj("人文历史文物古迹"),
rwlsfjms("人文历史风景名胜");
private String value;
XzqgkEnum(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
三. 引用反射工具类
package com.test.util.reflect;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ReflectUtil {
/**
* 获取子类及其父类的所有字段(含多继承)
*
* @param clazz 类
* @param <T> 类型
* @return 字段数组
*/
@SuppressWarnings("unchecked")
public static <T> Field[] getAllDeclaredFields(Class<T> clazz) {
List<Field> tempList = new ArrayList<>();
while (!ObjectUtils.isEmpty(clazz)) {
Field[] declaredFields = clazz.getDeclaredFields();
tempList.addAll(Arrays.asList(declaredFields));
clazz = (Class<T>) clazz.getSuperclass();
}
Field[] allFieldArr = new Field[tempList.size()];
tempList.toArray(allFieldArr);
return allFieldArr;
}
/**
* 获取父类的所有字段(含多继承)
*
* @param clazz 类
* @param <T> 类型
* @return 字段数组
*/
@SuppressWarnings("unchecked")
public static <T> Field[] getAllSuperDeclaredFields(Class<T> clazz) {
List<Field> tempList = new ArrayList<>();
while (!ObjectUtils.isEmpty(clazz) && !ObjectUtils.isEmpty(clazz.getSuperclass())) {
clazz = (Class<T>) clazz.getSuperclass();
Field[] declaredFields = clazz.getDeclaredFields();
tempList.addAll(Arrays.asList(declaredFields));
}
Field[] allFieldArr = new Field[tempList.size()];
tempList.toArray(allFieldArr);
return allFieldArr;
}
public static <T, E> E copyProperties(T t, Class<E> eClass) {
// 判断传入源数据是否为空,如果空,则抛自定义异常
if (null == t) {
throw new RuntimeException("数据源为空");
}
// 获取源对象的类的详情信息
Class<?> sClass = t.getClass();
// 获取源对象的所有属性
Field[] sFields = sClass.getDeclaredFields();
// 获取目标对象的所有属性
Field[] tFields = eClass.getDeclaredFields();
E target;
try {
// 通过类的详情信息,创建目标对象 这一步等同于UserTwo target = new UserTwo();
target = eClass.newInstance();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("目标对象创建失败");
}
// 循环取到源对象的单个属性
for (Field sField : sFields) {
// 循环取到目标对象的单个属性
for (Field tField : tFields) {
// 判断源对象的属性名、属性类型是否和目标对象的属性名、属性类型一致
if (sField.getName().equals(tField.getName()) && sField.getGenericType().equals(tField.getGenericType())) {
try {
// 获取源对象的属性名,将属性名首字母大写,拼接如:getUsername、getId的字符串
String sName = sField.getName();
char[] sChars = sName.toCharArray();
sChars[0] -= 32;
String sMethodName = "get" + String.valueOf(sChars);
// 获得属性的get方法
Method sMethod = sClass.getMethod(sMethodName);
// 调用get方法
Object sFieldValue = sMethod.invoke(t);
// 获取目标对象的属性名,将属性名首字母大写,拼接如:setUsername、setId的字符串
String tName = tField.getName();
char[] tChars = tName.toCharArray();
tChars[0] -= 32;
String tMethodName = "set" + String.valueOf(tChars);
// 获得属性的set方法
Method tMethod = eClass.getMethod(tMethodName, tField.getType());
// 调用方法,并将源对象get方法返回值作为参数传入
tMethod.invoke(target, sFieldValue);
break;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(ReflectUtil.class.getName() + "调用copyProperties出现异常:" + e.getMessage());
}
}
}
}
// 返回集合
return target;
}
public static <T, E> List<E> copyProperties(List<T> listT, Class<E> eClass) {
// 判断传入源数据是否为空,如果空,则抛自定义异常
if (CollectionUtils.isEmpty(listT)) {
throw new RuntimeException("数据源为空");
}
List<E> listE = new ArrayList<>();
for (T t : listT) {
listE.add(copyProperties(t, eClass));
}
// 返回集合
return listE;
}
}
四. 编写测试用例
import com.test.domain.Xzqgk;
import com.test.emun.XzqgkEnum;
import com.test.util.reflect.ReflectUtil;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class reflect {
public static void main(String[] args) {
Xzqgk one = getOne();
Field[] fields = ReflectUtil.getAllDeclaredFields(Xzqgk.class);
for (Field field : fields) {
String name = field.getName(); // 对象中的属性名称
XzqgkEnum xzqgkEnum = XzqgkEnum.valueOf(name); // 枚举类中属性名称
char[] sChars = name.toCharArray();
sChars[0] -= 32;
String sMethodName = "get" + String.valueOf(sChars);
// 获得属性的get方法
Method sMethod = null;
String sFieldValue = null;
try {
sMethod = Xzqgk.class.getMethod(sMethodName);
// 调用get方法
sFieldValue = (String) sMethod.invoke(one);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("名称 = " + xzqgkEnum.getValue() + " --> " + "值 = " + sFieldValue);
}
}
private static Xzqgk getOne() {
Xzqgk xzqgk = new Xzqgk();
xzqgk.setXzqdm("行政区代码");
xzqgk.setXzqmc("行政区名称");
xzqgk.setXzqdlhj("行政区地理环境");
xzqgk.setXzqtp("行政区图片(链接)");
xzqgk.setXzqxzqh("行政区行政区划");
xzqgk.setKczyjj("矿产资源简介");
xzqgk.setDzhjjj("地质环境简介");
xzqgk.setDszyjj("淡水资源简介");
xzqgk.setSdzyjj("湿地资源简介");
xzqgk.setJjfzjj("经济发展简介");
xzqgk.setRwlsfy("人文历史-方言");
xzqgk.setRwlsys("人文历史-饮食");
xzqgk.setRwlswwgj("人文历史-文物古迹");
xzqgk.setRwlsfjms("人文历史-风景名胜");
return xzqgk;
}
}