1、运行截图
2、公共方法
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.time.DateFormatUtils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Slf4j
public class InvokeUtil {
public static void main(String[] args) {
Map<String, String> valMap = new HashMap<String, String>();
valMap.put("name", "测试");
valMap.put("statue", "a");
valMap.put("age", "23");
valMap.put("height", "173.5");
valMap.put("weight", "53.7");
valMap.put("amount", "573");
valMap.put("number", "1");
valMap.put("work", "2");
valMap.put("fund", "4.1");
valMap.put("date", "2021-12-31");
valMap.put("time", "2021-12-31 23:34:11");
valMap.put("dateTime", "1618560281465");
valMap.put("flag", "false");
InvokeEntity entity = new InvokeEntity();
setBeanFieldValue(entity, valMap);
System.out.println("反射赋值:" + entity.toString());
System.out.println("反射取值:");
Map<String, String> fieldValMap = getBeanFieldValue(entity);
for (Map.Entry<String, String> entry : fieldValMap.entrySet()) {
System.out.println("字段名:["+entry.getKey()+"],字段值:[" + entry.getValue()+"]");
}
}
/**
* get bean field value to value map
* @param bean java bean
* @return value map K:field V:value
*/
public static Map<String, String> getBeanFieldValue(Object bean) {
Class<?> beanClass = bean.getClass();
Map<String, String> valueMap = new HashMap<String, String>();
Method[] methods = beanClass.getDeclaredMethods();
Field[] fields = beanClass.getDeclaredFields();
for (Field field : fields) {
try {
String fieldGetMethodName = spliceGetMethod(field.getName());
if (!checkPropertyMethodExist(methods, fieldGetMethodName)) continue;
Method fieldGetMethod = beanClass.getMethod(fieldGetMethodName, new Class[] {});
Object fieldValue = fieldGetMethod.invoke(bean, new Object[] {});
if(null != fieldValue){
if ("Date".equals(field.getType().getSimpleName())) {
valueMap.put(field.getName(), DateFormatUtils.format((Date)fieldValue, "yyyy-MM-dd HH:mm:ss"));
continue;
}
valueMap.put(field.getName(), String.valueOf(fieldValue));
}
} catch (Exception e) {
log.error("get bean value error" + field, e);
}
}
return valueMap;
}
/**
* set bean field value by value map
* @param bean java bean
* @param valueMap value map K:field V:value
*/
public static void setBeanFieldValue(Object bean, Map<String, String> valueMap) {
Class<?> beanClass = bean.getClass();
Method[] methods = beanClass.getDeclaredMethods();
Field[] fields = beanClass.getDeclaredFields();
for (Field field : fields) {
try {
String fieldSetName = spliceSetMethod(field.getName());
if (!checkPropertyMethodExist(methods, fieldSetName)) continue;
Method fieldSetMet = beanClass.getMethod(fieldSetName, field.getType());
String value = valueMap.get(field.getName());
fieldSetMet.invoke(bean, getFieldTypeValue(field, value));
} catch (Exception e) {
log.error("set bean value error" + field, e);
}
}
}
/**
* return the corresponding type value according to the field property
* @param field the field
* @param value original value
* @return corresponding type value
*/
public static Object getFieldTypeValue(Field field, Object value){
if(null == field || null == value || "".equals(value)) return null;
String fieldType = field.getType().getSimpleName();
if ("String".equals(fieldType)) return String.valueOf(value);
if ("Date".equals(fieldType)) {
if (String.valueOf(value).indexOf(':') > 0) return Date.from(LocalDateTime.parse(String.valueOf(value), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")).atZone(ZoneId.systemDefault()).toInstant());
return Date.from(LocalDate.parse(String.valueOf(value), DateTimeFormatter.ofPattern("yyyy-MM-dd")).atStartOfDay(ZoneId.systemDefault()).toInstant());
}
if ("Integer".equals(fieldType) || "int".equals(fieldType)) return Integer.parseInt(String.valueOf(value));
if ("Long".equalsIgnoreCase(fieldType)) return Long.parseLong(String.valueOf(value));
if ("Float".equalsIgnoreCase(fieldType)) return Float.parseFloat(String.valueOf(value));
if ("Double".equalsIgnoreCase(fieldType)) return Double.parseDouble(String.valueOf(value));
if ("Short".equalsIgnoreCase(fieldType)) return Short.parseShort(String.valueOf(value));
if ("Byte".equalsIgnoreCase(fieldType)) return Byte.parseByte(String.valueOf(value));
if ("BigDecimal".equalsIgnoreCase(fieldType)) return new BigDecimal(String.valueOf(value));
if ("Character".equals(fieldType) || "char".equals(fieldType)) return String.valueOf(value).charAt(0);
if ("Boolean".equalsIgnoreCase(fieldType)) return Boolean.parseBoolean(String.valueOf(value));
if ("TimeStamp".equalsIgnoreCase(fieldType)) return new Timestamp(Long.valueOf(String.valueOf(value)));
return value;
}
/**
* judge whether it exists method of a property
* @param methods object property method list
* @param fieldMethod get or set method
* @return true: exist, false: not exist
*/
public static boolean checkPropertyMethodExist(Method[] methods, String fieldMethod) {
if(null == fieldMethod || "".equals(fieldMethod)) return false;
for (Method met : methods) {
if (fieldMethod.equals(met.getName())) return true;
}
return false;
}
/**
* splicing property get or set methods
* @param fieldName property name
* @param method get or set method
* @return methods after splicing
*/
public static String splicePropertyMethod(String fieldName, String method) {
if (null == fieldName || "".equals(fieldName)) return null;
return method + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
}
/**
* splicing property get method
* @param fieldName property
* @return get method after splicing
*/
public static String spliceGetMethod(String fieldName) {
return splicePropertyMethod(fieldName, "get");
}
/**
* splicing property set method
* @param fieldName property
* @return set method after splicing
*/
public static String spliceSetMethod(String fieldName) {
return splicePropertyMethod(fieldName, "set");
}
}
3、测试实体
import lombok.Data;
import java.sql.Timestamp;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class InvokeEntity {
private String name;
private Character statue;
private Integer age;
private Float height;
private Double weight;
private Long amount;
private Short number;
private Byte work;
private BigDecimal fund;
private Date date;
private Date time;
private Timestamp dateTime;
private boolean flag;
@Override
public String toString() {
return "InvokeEntity{" +
"name='" + name + '\'' +
", statue=" + statue +
", age=" + age +
", height=" + height +
", weight=" + weight +
", amount=" + amount +
", number=" + number +
", work=" + work +
", fund=" + fund +
", date=" + date +
", time=" + time +
", dateTime=" + dateTime +
", flag=" + flag +
'}';
}
}
转载链接:
https://blog.youkuaiyun.com/qq_38254635/article/details/115765808?ops_request_misc=%257B%2522request%255Fid%2522%253A%25227ED3F16C-248C-4ECD-A128-2C3935097C4E%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=7ED3F16C-248C-4EC