定义了一个自定义注解@Test,该注解能否继承Lombok里的@Data注解生成getset方法的功能呢?
不太想在每个类上加太多注解,也不好维护,想把各个功能的注解合并到一个自定义注解当中,可以实现吗?
定义了一个自定义注解@Test,该注解能否继承Lombok里的@Data注解生成getset方法的功能呢?
不太想在每个类上加太多注解,也不好维护,想把各个功能的注解合并到一个自定义注解当中,可以实现吗?
java原生是不支持的,不过你可以使用annotation processor的办法在java编译期间修改class,识别到你的自定义注解然后再加上对应的lombok注解,但这样还需要配置对应的IDE插件,总之有办法,但是有点复杂
java原生是不支持的,但是如果你用了spring,那么spring提供了注解继承的功能,如下:
有个父类HttpHeader
然后AcceptJson这么写继承于HttpHeader
使用的地方你可以这么使用,选择其中一个即可,他两其实是等价的
注意,在读取注解的时候不能用Java反射API,而应该使用AnnotatedElementUtils.getAllMergedAnnotations
你可以创建一个自定义注解,并在需要的地方同时使用 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());
}
}
}
间接方式实现注解功能组合:
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;
}
}
com.example.MyCustomAnnotationProcessor
3 回答2.4k 阅读✓ 已解决
3 回答3.8k 阅读✓ 已解决
8 回答3.2k 阅读
4 回答2.5k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
1 回答2k 阅读✓ 已解决
3 回答1.5k 阅读✓ 已解决
不能,注解是元数据,不能像类那样通过继承来复用功能,可以用组合注解