Java 通过反射机制对Object对象中的变量进行集体变更

package com.xj.util;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * @Description : 通过反射机制对Object对象中的变量进行集体变更
 */
public class ObjectModifyUtil {

    private final static String ZERO_8 = "0.00000000";
    private final static String ZERO_E_8 = "0E-8";
    private final static String ZERO = "0.00";
    private final static Integer AGE = 18;


    public static void setPropertyValue(Object source) throws IllegalAccessException{

        //断言 如果source为空报异常
        assert source != null;

        //返回Class中所有的字段,包括私有字段
        Field[] fields = source.getClass().getDeclaredFields();

        for (Field field : fields){
            //让我们在用反射时可以访问私有变量,否则会报错
            field.setAccessible(true);
            /**
             * Field的getModifiers()方法返回int类型值表示该字段的修饰符.其中,
             *              该修饰符是java.lang.reflect.Modifier的静态属性.
             * 对应表如下:
             *      STATIC: 8
             *      PUBLIC: 1
             *      PRIVATE: 2
             *      PROTECTED: 4
             */
            //如果是带有“static”的变量,直接跳过
            if((field.getModifiers() & Modifier.STATIC) > 0){
                continue;
            }

            Class<?> type = field.getType();

            Object value = field.get(source);

            //如果是BigDecimal类型
            if(type.equals(BigDecimal.class)){
                if(value == null){
                    //如果BigDecimal类型的字段值为null,赋值为0
                    field.set(source, BigDecimal.ZERO);
                }
            }

            if(value != null){
                if (value.equals(new BigDecimal(ZERO_8))){
                    //如果BigDecimal类型的字段值为0.00000000,赋值为0,且保留小数2位
                    field.set(source, BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP));
                }
            }
            //如果是String类型
            if(type.equals(String.class)){
                if(value != null){
                    if(value.equals(ZERO_8) || value.equals(ZERO_E_8)){
                        //如果String类型的字段值为0.00000000 或 0E-8,赋值为0.00
                        field.set(source, ZERO);
                    }
                }
            }
            //如果是Integer类型
            if(type.equals(Integer.class)){
                if(value != null){
                    if(value != AGE ){
                        //当不为18岁时,要保证永远18岁
                        field.set(source,AGE);
                    }
                }
            }
        }
    }

    //对工具类进行测试
    public static void main(String[] args) throws Exception{
        UserObject userObject = new UserObject();

        System.out.println(userObject.getClass().getName() + "--变更前-->" + userObject.toString());
        //调用工具类,对UserObject中变量进行变更
        new ObjectModifyUtil().setPropertyValue(userObject);

        System.out.println(userObject.getClass().getName() + "--变更后-->" + userObject.toString());
    }
}
//定义一个类对象
class UserObject{

    private BigDecimal saveMoney;

    public String strSaveMoney1;

    public String strSaveMoney2;

    public Integer age;

    //无参构造方法
    public UserObject(){
        saveMoney = new BigDecimal("0.00000000");
        strSaveMoney1 = "0E-8";
        strSaveMoney2 = "0.00000000";
        age = 36;
    }

    public BigDecimal getSaveMoney() {
        return saveMoney;
    }

    public void setSaveMoney(BigDecimal saveMoney) {
        this.saveMoney = saveMoney;
    }

    public String getStrSaveMoney1() {
        return strSaveMoney1;
    }

    public void setStrSaveMoney1(String strSaveMoney1) {
        this.strSaveMoney1 = strSaveMoney1;
    }

    public String getStrSaveMoney2() {
        return strSaveMoney2;
    }

    public void setStrSaveMoney2(String strSaveMoney2) {
        this.strSaveMoney2 = strSaveMoney2;
    }

    public Integer getAge() {
        return age;
    }

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

    //重写toString方法
    @Override
    public String toString() {
        return "saveMoney:" + saveMoney + "  strSaveMoney1:" + strSaveMoney1 + "  strSaveMoney2:" + strSaveMoney2 +"  age:" + age;
    }
}

参考文献:

1.Field的getModifiers()方法返回int类型值表示该字段的修饰符_码眼的博客-CSDN博客

2.field.setAccessible(true)_闵浮龙的博客-CSDN博客_field.setaccessible(true)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值