Java通过反射机制,动态设置对象属性值

1 : 测试截图

在这里插入图片描述

2 : 工具类
package util;

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 : 测试Bean
package util;

import java.sql.Timestamp;
import java.math.BigDecimal;
import java.util.Date;

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;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Character getStatue() {
        return statue;
    }

    public void setStatue(Character statue) {
        this.statue = statue;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Float getHeight() {
        return height;
    }

    public void setHeight(Float height) {
        this.height = height;
    }

    public Double getWeight() {
        return weight;
    }

    public void setWeight(Double weight) {
        this.weight = weight;
    }

    public Long getAmount() {
        return amount;
    }

    public void setAmount(Long amount) {
        this.amount = amount;
    }

    public Short getNumber() {
        return number;
    }

    public void setNumber(Short number) {
        this.number = number;
    }

    public Byte getWork() {
        return work;
    }

    public void setWork(Byte work) {
        this.work = work;
    }

    public BigDecimal getFund() {
        return fund;
    }

    public void setFund(BigDecimal fund) {
        this.fund = fund;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public Date getTime() {
        return time;
    }

    public void setTime(Date time) {
        this.time = time;
    }

    public Timestamp getDateTime() {
        return dateTime;
    }

    public void setDateTime(Timestamp dateTime) {
        this.dateTime = dateTime;
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = 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 +
                '}';
    }
}

4 : 参考链接

http://www.itxm.cn/post/2706.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java反射是指在程序运行的时候,通过特定的API来检查或修改程序的状态、能力和内部属性等,而这些在正常情况下是无法通过编译时检查来完成的。例如,通过反射机制,我们可以获取一个对象的类型信息并调用其方法、访问它的属性,以及创建一个新对象等。 反射获取对象属性,首先需要通过Class类的forName()方法来获取对象的Class实例。然后通过Class类的getDeclaredField()方法获取对象属性的Field对象,再通过Field对象的get()方法来获取属性。如果需要获取私有属性,则需要通过setAccessible(true)方法来取消Java语言的访问检查机制,以允许获取私有属性。 例如,假设有一个Person类,其中包含有一个private String name属性,现在需要获取该属性,可以使用反射机制进行如下操作: ``` Class<?> clazz = Person.class; Object obj = clazz.newInstance(); Field field = clazz.getDeclaredField("name"); field.setAccessible(true); String nameValue = (String) field.get(obj); ``` 通过以上代码,我们可以获取Person对象的name属性,并将其赋给nameValue变量中。 需要注意的是,反射机制虽然功能强大,但由于它会在运行时改变程序的状态和能力,因此会带来诸多安全性和性能上的问题,尤其是容易引起类型转换异常和内存泄漏等问题,因此在使用反射机制时要谨慎操作,避免不必要的风险。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值