java 通过反射修改对象的值

通过反射修改类的相关属性值等

需求大概

我们的业务系统的订单最后生成订货发货单中,需要将里面所有BigDecimal 类型的值 做特殊处理
金额为 0 就做空 不为零要保留小数等等

代码实现

		//获取class对象
		Class<? extends OrderDTO> order= orderDTO.getClass();
		Field[] declaredFields = order.getDeclaredFields();
		// 解析遍历所有字段属性
		for (Field field : declaredFields) {
			field.setAccessible(true);
			Object value = field.get(orderDTO);
			if (!Objects.isNull(value)&& field.getType().equals(BigDecimal.class)){
				//若字段值不为空 则继续下一步操作
				BigDecimal bigDecimal = (BigDecimal)value;
				//保留两位小数
				BigDecimal zero = BigDecimal.ZERO.setScale(2);
				//有相关价格为空时
				if (zero.equals(bigDecimal)){
					field.set(orderDTO,null);
				}
			}else if (!Objects.isNull(value) && "0".equals(value.toString())){
				field.set(orderDTO,null);
			}else if (!Objects.isNull(value) && "0.00".equals(value.toString())){
				field.set(orderDTO,null);
			}
		}

通过filed.set()方法设置需要修改的业务值
这样就不需要使用大量的重复代码 if 去判断每个字段的字段值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,需要获取到需要修改注解的类的Class对象。然后,通过该Class对象的getDeclaredField()方法获取需要修改注解的字段,再通过该字段的getAnnotations()方法获取所有注解,接着遍历注解数组,找到需要修改的注解,使用Java反射的Proxy.newProxyInstance()方法创建一个代理对象,并在代理对象中实现InvocationHandler接口,在invoke()方法中修改注解的。最后,通过反射调用setAnnotation()方法将修改后的注解设置回原字段中。 以下是示例代码: ``` // 获取Class对象 Class<?> clazz = MyClass.class; // 获取需要修改注解的字段 Field field = clazz.getDeclaredField("myField"); // 获取所有注解 Annotation[] annotations = field.getAnnotations(); // 遍历注解数组 for (Annotation annotation : annotations) { // 判断是否需要修改的注解 if (annotation.annotationType() == MyAnnotation.class) { // 创建代理对象 Object proxy = Proxy.newProxyInstance(annotation.getClass().getClassLoader(), new Class[]{annotation.annotationType()}, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 修改注解的 if (method.getName().equals("value")) { return "new value"; } else { return method.invoke(annotation, args); } } }); // 将修改后的注解设置回原字段中 field.setAnnotation((MyAnnotation) proxy); } } ``` 需要注意的是,修改注解的是在代理对象的invoke()方法中实现的,需要根据注解的属性名称进行判断和修改。同时,由于注解是不可变的,因此需要使用代理对象来动态修改注解的属性

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值