Java中自定义注解能否继承其它注解的功能?

定义了一个自定义注解@Test,该注解能否继承Lombok里的@Data注解生成getset方法的功能呢?
不太想在每个类上加太多注解,也不好维护,想把各个功能的注解合并到一个自定义注解当中,可以实现吗?

阅读 985
4 个回答

不能,注解是元数据,不能像类那样通过继承来复用功能,可以用组合注解

java原生是不支持的,不过你可以使用annotation processor的办法在java编译期间修改class,识别到你的自定义注解然后再加上对应的lombok注解,但这样还需要配置对应的IDE插件,总之有办法,但是有点复杂

java原生是不支持的,但是如果你用了spring,那么spring提供了注解继承的功能,如下:
有个父类HttpHeader
image.png
然后AcceptJson这么写继承于HttpHeader
image.png
使用的地方你可以这么使用,选择其中一个即可,他两其实是等价的
image.png
注意,在读取注解的时候不能用Java反射API,而应该使用AnnotatedElementUtils.getAllMergedAnnotations
image.png

你可以创建一个自定义注解,并在需要的地方同时使用 Lombok 的注解。
定义自定义注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation {
    String value() default "";
}

在类上同时使用 Lombok 和自定义注解

import lombok.Data;

@Data
@MyCustomAnnotation("Example class with Lombok and custom annotation")
public class Example {
    private String name;
    private int age;

    public static void main(String[] args) {
        Example example = new Example();
        example.setName("John");
        example.setAge(30);
        System.out.println("Name: " + example.getName());
        System.out.println("Age: " + example.getAge());

        MyCustomAnnotation annotation = Example.class.getAnnotation(MyCustomAnnotation.class);
        if (annotation != null) {
            System.out.println("Annotation value: " + annotation.value());
        }
    }
}

间接方式实现注解功能组合:

  1. 创建注解处理器
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Processor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import java.util.Set;

@SupportedAnnotationTypes("MyCustomAnnotation")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class MyCustomAnnotationProcessor extends AbstractProcessor {

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        for (Element element : roundEnv.getElementsAnnotatedWith(MyCustomAnnotation.class)) {
            // 在这里处理注解逻辑,比如生成代码
            MyCustomAnnotation annotation = element.getAnnotation(MyCustomAnnotation.class);
            System.out.println("Processing: " + element.getSimpleName() + " with annotation value: " + annotation.value());
        }
        return true;
    }
}
  1. 注册注解处理器
    在 META-INF/services 目录下创建一个名为 javax.annotation.processing.Processor 的文件,并在文件中添加注解处理器的完整类名:
com.example.MyCustomAnnotationProcessor
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏