有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java方法注释继承

所以,我的问题是,我使用注释来标记类的方法

我的主要注释是@Action,我需要一个针对特定方法的更强注释,即@SpecificAction

所有用@SpecificAction注释的方法都必须注释为@Action。 我的想法是用@Action注释@SpecificAction

@Action
[other irrelevant annotations]
public @interface SpecificAction{}

@SpecificAction
public void specificMethod(){}

我希望specificMethod.isAnnotationPresent(Action.class)是真的,但事实并非如此

我怎样才能使@Action注释被“继承”呢


共 (1) 个答案

  1. # 1 楼答案

    正如@assylias的链接所说,注释不能被继承,但您可以使用组合,递归搜索目标注释,如下所示:

    public static class AnnotationUtil {
    
        private static <T extends Annotation> boolean containsAnnotation(Class<? extends Annotation> annotation, Class<T> annotationTypeTarget, Set<Class<? extends Annotation>> revised) {
            boolean result = !revised.contains(annotation);
            if (result && annotationTypeTarget != annotation) {
                Set<Class<? extends Annotation>> nextRevised = new HashSet<>(revised);
                nextRevised.add(annotation);
                result = Arrays.stream(annotation.getAnnotations()).anyMatch(a -> containsAnnotation(a.annotationType(), annotationTypeTarget, nextRevised));
            }
            return result;
        }
    
        public static <T extends Annotation> boolean containsAnnotation(Class<? extends Annotation> annotation, Class<T> annotationTypeTarget) {
            return containsAnnotation(annotation, annotationTypeTarget, Collections.emptySet());
        }
    
        public static <T extends Annotation> Map<Class<? extends Annotation>, ? extends Annotation> getAnnotations(Method method, Class<T> annotationTypeTarget) {
            return Arrays.stream(method.getAnnotations()).filter(a -> containsAnnotation(a.annotationType(), annotationTypeTarget)).collect(Collectors.toMap(a -> a.annotationType(), Function.identity()));
        }
    }
    

    如果你有:

    @Retention(RetentionPolicy.RUNTIME)
    @interface Action {
    }
    
    @Action
    @Retention(RetentionPolicy.RUNTIME)
    @interface SpecificAction {
    }
    
    @Action
    @Retention(RetentionPolicy.RUNTIME)
    @interface ParticularAction {
    }
    
    public class Foo{
        @SpecificAction
        @ParticularAction
        public void specificMethod() {
             // ...
        }
    }
    

    您可以这样使用:AnnotationUtil.getAnnotations(specificMethod, Action.class);,这将返回一个映射:{interface foo.ParticularAction=@foo.ParticularAction(), interface foo.SpecificAction=@foo.SpecificAction()}