如何向Java自定义组合注解传递参数并同步给内部元注解
解决方案
是可以实现的,不过要注意:Java原生注解本身不支持属性自动透传给元注解,如果是Spring生态下使用组合注解(绝大多数组合注解的使用场景),可以通过Spring提供的@AliasFor注解完成属性映射,达到你要的通用化效果。
改造后的自定义注解代码
import org.springframework.core.annotation.AliasFor; import java.lang.annotation.*; @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) // 元注解这里不要硬写input值 @Annotation1 @Annotation2 @Annotation3 public @interface CustomAnnotation { // 分别给三个元注解的input属性设置别名映射 @AliasFor(annotation = Annotation1.class, attribute = "input") @AliasFor(annotation = Annotation2.class, attribute = "input") @AliasFor(annotation = Annotation3.class, attribute = "input") Class<?> input(); }
用法(和你预期的完全一致)
@CustomAnnotation(input = SomeClass.class) public void yourMethod() { // 方法逻辑 }
注意事项
- 该映射规则只有Spring的注解解析逻辑才能识别,原生Java反射直接读取元注解无法拿到透传的
input值:- Spring场景下调用
AnnotationUtils、AnnotatedElementUtils工具类读取注解即可自动解析别名 - 非Spring场景需要自己编写注解解析逻辑,读取
CustomAnnotation的input值后手动关联到三个元注解的对应业务逻辑,无开箱即用的属性透传能力
- Spring场景下调用
- 三个元注解
@Annotation1/@Annotation2/@Annotation3的input属性类型必须和CustomAnnotation中定义的input属性类型完全一致 - 如果需要给不同元注解传不同的
input值,也可以拆分定义多个属性分别映射不同元注解的对应属性
内容的提问来源于stack exchange,提问作者Balkrishna Kardam
相关产品推荐
相关产品推荐

