关于java反射的基础实践二

书接上回,反射一个对象中的属性值乘以1000,我们解决了,那么如果对象中有list呢,如下:怎么办?

@Data
@Accessors(chain = true)
public class TestDto {

    private BigDecimal testOneExp;

    private BigDecimal testTwoExp;

    private String testThree;

    private List<TestDto> testFour;
}
再测试一下

public class TestService {

    public static void main(final String[] args) {
        List<TestDto> f = new ArrayList<>();
        final TestDto dto  = new TestDto();
        dto.setTestOneExp(new BigDecimal("1"));
        dto.setTestTwoExp(new BigDecimal("2"));
        dto.setTestThree("3");
        final TestDto dtoFour  = new TestDto();
        dtoFour.setTestOneExp(new BigDecimal("4"));
        dtoFour.setTestTwoExp(new BigDecimal("5"));
        dtoFour.setTestThree("6");
        f.add(dtoFour);
        dto.setTestFour(f);
        updateMoney(dto,new BigDecimal("1000"));
        System.out.println(dto.getTestOneExp());
        System.out.println(dto.getTestTwoExp());
        System.out.println(dto.getTestThree());
        System.out.println(dto.getTestFour().get(0).getTestOneExp());
        System.out.println(dto.getTestFour().get(0).getTestTwoExp());
        System.out.println(dto.getTestFour().get(0).getTestThree());
    }

    public static void updateMoney(final Object o,final BigDecimal mul) {
        try {
            final Class<? extends Object> aClass = o.getClass();
            final Field[] declaredFields = aClass.getDeclaredFields();
            for (final Field field : declaredFields) {
                field.setAccessible(true);
                if ("class java.math.BigDecimal".equals(field.getGenericType().toString())) {
                    final Method m = aClass.getMethod(
                            "get" + upperCase(field.getName()));
                    final Object invoke1 = m.invoke(o);
                    if (invoke1 == null) {
                        continue;
                    }
                    final BigDecimal invoke = (BigDecimal) invoke1;
                    final String n = "set" + upperCase(field.getName());
                    final Method mset = aClass.getMethod(n, field.getType());
                    mset.invoke(o, new Object[]{invoke.multiply(mul)});
                }
            }
        } catch (Exception e) {
           System.out.println(e.getMessage());
        }
    }
    private static String upperCase(final String str) {
        return str.substring(0, 1).toUpperCase() + str.substring(1);
    }
}

运行结果:

我们发现 list中的属性没有被乘以1000,思考一番,解决方案还是来自于if ("class java.math.BigDecimal".equals(field.getGenericType().toString()))这个判断上,然后开始修改:

 public static void updateMoney(final Object o,final BigDecimal mul) {
        try {
            final Class<? extends Object> aClass = o.getClass();
            final Field[] declaredFields = aClass.getDeclaredFields();
            for (final Field field : declaredFields) {
                field.setAccessible(true);
                if ("class java.math.BigDecimal".equals(field.getGenericType().toString())) {
                    final Method m = aClass.getMethod(
                            "get" + upperCase(field.getName()));
                    final Object invoke1 = m.invoke(o);
                    if (invoke1 == null) {
                        continue;
                    }
                    final BigDecimal invoke = (BigDecimal) invoke1;
                    final String n = "set" + upperCase(field.getName());
                    final Method mset = aClass.getMethod(n, field.getType());
                    mset.invoke(o, new Object[]{invoke.multiply(mul)});
                }else if (field.getGenericType().toString().contains("java.util.List<")){
                    // 如果发现是list 再抓一遍属性递归一下,好不好。
                    final  Method m = aClass.getMethod(
                            "get" + upperCase(field.getName()));
                    final List<Object> obj = (List<Object>)m.invoke(o);
                    if (obj==null){
                        continue;
                    }
                    for (final Object oo:obj){
                        if (oo==null){
                            continue;
                        }
                        updateMoney(oo,mul);
                    }
                }
            }
        } catch (Exception e) {
           System.out.println(e.getMessage());
        }
    }

再测一遍,看看修改的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值