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

我这里有一个需求需要修改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文件的内容
	}
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: `@Getter` 和 `@Setter` 注解是 Lombok 库注解,可以自动为类的属性生成 getter 和 setter 方法。使用这些注解可以简化代码,避免手动编写 getter 和 setter 方法。 在使用 `@Getter` 注解时,Lombok 会自动为类的所有非静态属性生成对应的 getter 方法。例如,对于以下类: ```java public class User { private String username; private int age; } ``` 使用 `@Getter` 注解后,Lombok 会自动生成以下代码: ```java public class User { @Getter private String username; @Getter private int age; } ``` 在使用 `@Setter` 注解时,Lombok 会自动为类的所有非静态属性生成对应的 setter 方法。例如,对于以下类: ```java public class User { private String username; private int age; } ``` 使用 `@Setter` 注解后,Lombok 会自动生成以下代码: ```java public class User { @Setter private String username; @Setter private int age; } ``` 需要注意的是,使用 `@Getter` 和 `@Setter` 注解时,属性必须是非私有的,否则 Lombok 无法生成对应的方法。可以使用 `@Getter(AccessLevel.PROTECTED)` 和 `@Setter(AccessLevel.PROTECTED)` 来生成受保护的 getter 和 setter 方法。另外,`@Getter` 和 `@Setter` 注解还支持一些数,可以控制生成的方法的访问级别、是否生成对应的静态方法等。 ### 回答2: Java的get和set方法是用来访问和修改类的私有属性的。在Java,可以使用注解来自动生成get和set方法,以简化代码的编写工作。 常见的使用注解生成get和set方法的方式是使用Lombok库的@Getter和@Setter注解。通过在类的属性上添加这两个注解,编译时会自动为该属性生成对应的get和set方法。例如,对于一个name属性,通过在类的定义添加@Getter和@Setter注解,即可自动生成getName和setName方法。 使用get和set方法的好处是可以对属性的访问进行控制,可以在方法内做额外的逻辑处理,例如验证输入的有效性或者修改属性的值。同时,通过get方法来获取属性的值,可以实现封装性,提高代码的安全性和可维护性。 在使用注解自动生成get和set方法时,需要注意以下几点: 1. 注解生成的get和set方法只能应用于具有对应注解的属性上。 2. 使用自动生成的get和set方法时,需要在类的实例上调用该方法。 3. 自动生成的方法的名称遵循Java Bean规范,get方法用于获取属性值,set方法用于设置属性值。 总而言之,使用注解自动生成get和set方法可以简化Java代码的编写工作,提高代码的可读性和可维护性。但在实际使用仍需要注意对应注解的使用规范,以及方法的调用方式。 ### 回答3: Java的get和set方法主要用于对对象的属性进行访问和修改。通常,我们需要手动编写这些方法来保证对象属性的封装性和安全性。为了简化这一过程,Java提供了一种注解机制,即使用注解来自动生成get和set方法。 在Java,我们可以使用`@java.beans.Property`注解来为属性自动生成get和set方法。只需要在属性定义的上方加上该注解,就可以自动为该属性生成对应的方法。 例如,我们有一个类Person,其有一个属性名为name: ```java public class Person { @java.beans.Property private String name; //其他代码 } ``` 在上述代码,我们使用了`@java.beans.Property`注解,可以看到,这个注解用来标记name属性,并且它不需要写任何数。此时,编译器会自动为该属性生成名为getName和setName的get和set方法,我们不需要手动实现。 生成的方法如下: ```java public String getName() { return name; } public void setName(String name) { this.name = name; } ``` 使用注解自动生成get和set方法的好处是大大减少了我们手动编写这些方法的工作量,特别是在属性较多的情况下,可以提高开发效率。同时,使用注解生成的方法也遵循了JavaBean的命名规范,方便其他开发者理解和使用。 需要注意的是,使用注解自动生成get和set方法时,属性必须是私有的(private),这样才能保证封装性和安全性。同时,属性的命名也要符合JavaBean的命名规范,即以小写字母开头,采用驼峰命名法。 总之,通过使用`@java.beans.Property`注解,我们可以简化Javaget和set方法的编写工作,提高开发效率。同时,注解生成的方法也符合JavaBean的命名规范,方便使用和理解。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值