我有以下自定义注释:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface CustomAnnotation {
public String value() default "";
}
和以下类别:
public class CustomClass {
@CustomAnnotation
private String name;
}
是否可以将CustomAnnotation的默认value()设置为等于指定类中的字段变量名,而不是像本例中那样被硬编码为空字符串-也就是说,当应用于特定字段时可以动态适应在类中,除非另有明确规定?例如。在这种情况下,它将是CustomClass中的“名称”。
答案 0 :(得分:2)
您可以在处理注释时获取字段名称。注释可以通过两种方式处理:使用反射或注释处理器。
这是一个如何处理refletion的示例:
List<String> names = Arrays.stream(myClassWithAnnotatedFields.getClass().getDeclaredFields())
.filter(field -> field.isAnnotationPresent(CustomAnnotation.class))
.map(Field::getName)
.collect(Collectors.toList())
这是一个如何使用注释处理器进行处理的示例:
import javax.annotation.processing.Processor;
import javax.annotation.processing.AbstractProcessor;
@com.google.auto.service.AutoService(Processor.class)
public class RespirationProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
List<Name> names = roundEnvironment.getElementsAnnotatedWith(CustomAnnotation.class)
.stream()
.map(Element::getSimpleName)
.collect(Collectors.toList());
}
}