通过反射动态修改自定义注解属性值
java/lang/reflect 这个包下面都是Java的反射类和工具。
Annotation 注解,也是位于这个包里的。
注解自从Java 5.0版本引入后,就成为了Java平台中非常重要的一部分,常见的有 @Override、 @Deprecated
关于注解更详细的信息和使用方法,网上已经有很多资料,自行查看。
一个注解通过 @Retention 指定其生命周期,本文所讨论的动态修改注解属性值,建立在 @Retention(RetentionPolicy.RUNTIM) 这种情况。
这种注解才能在运行时(runtime)通过反射机制进行修改属性的操作。
我们先定义一个自定义注解 @TestAnno 它有一个类型为 String 的 name属性,该注解应用再Method上:
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface TestAnno {
String name() default "";
}
我用自定义注解首先得了解清楚注解的值存储在什么地方,我们可以写个main方法测试一下:
通过反射获取注解@TestAnno的值
我们定义了一个RetryTestService 在它的方法 retryTest() 上添加@TestAnno 注解,然后在main方法里面反射获取注解的name值
@Service
public class RetryTestService {
@TimeLog
@TestAnno(name = "${nba.kobe}")
public String retryTest(){
System.out.println("---进行了接口请求....");
return "success";
}
public static void main(String[] args) throws NoSuchMethodException {
RetryTestService service = new RetryTestService();
Method method = service.getClass().getDeclaredMethod("retryTest",null);
TestAnno testAnno = method.getDeclaredAnnotation(TestAnno.class);
System.out.println(testAnno.name());
}
}