书接上回,反射一个对象中的属性值乘以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());
}
}
再测一遍,看看修改的效果。