动态修改JavaBean中的注解的参数值

本文介绍了一种使用反射和动态代理技术修改Java类中注解属性值的方法,通过实例展示了如何将Person类中@ApiParam注解的access属性从lala修改为fafa,并解释了这一过程不会改变原有class文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我这里有一个需求需要修改Person类中的一个属性上的注解的值进行修改,例如:

public class Person {
	private int age;
	@ApiParam(access="lala")
	private String name;
	//get set 方法忽略	
}

将@ApiParam(access=“lala”) 修改为@ApiParam(access=“fafa”),经过分析是可以实现的,需要用到动态代理进行操作。
具体源码如下所示:

@Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiParam {
	String access() default "";
}

反射+动态代理代码如下:

public class TestClazz {
	public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
		
		Person person = new Person();
		Field value = person.getClass().getDeclaredField("name");
		value.setAccessible(true);
		//APIParam 是一个自定义的注解
		ApiParam apiParam = (ApiParam) value.getAnnotation(ApiParam.class);
		java.lang.reflect.InvocationHandler invocationHandler = Proxy.getInvocationHandler(apiParam);
		Field memberValues = invocationHandler.getClass().getDeclaredField("memberValues");
		//通过反射获取memberValues  这个属性是Map类型 存放着所有的属性。
	   	memberValues.setAccessible(true);
	   	Map<String, Object> values = (Map<String, Object>) memberValues.get(invocationHandler);
	   	String val = (String) values.get("access");
		System.out.println("------改之前:"+val);
		values.put("access", "fafa");//修改属性
		System.out.println("-----------------");
		//Field value1 = person.getClass().getDeclaredField("name");
		value.setAccessible(true);
		ApiParam apiParam1 = (ApiParam) value.getAnnotation(ApiParam.class);

		System.out.println("------改之后:"+apiParam1.access());
		//动态代理的方式不会改变原先class文件的内容
	}
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值