2017-07-28 16 views
4

私の問題は次のとおりです。注釈を使用してクラスのメソッドにタグを付けています。メソッド注釈継承

私の主な注釈は@Actionであり、具体的な方法については、より強い注釈が必要です(@SpecificAction)。

@SpecificActionで注釈を付けたすべてのメソッドには、@Actionという注釈を付ける必要があります。 私の考えは@SpecificAction@Actionと注釈をつけることです。

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

@SpecificAction 
public void specificMethod(){} 

と私はspecificMethod.isAnnotationPresent(Action.class)が真実であることを期待するが、そうではありません。

@Action注釈が「継承」されるようにするにはどうすればよいですか?あなたが持っている場合は

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())); 
    } 
} 

:assyliasのリンク@として

+0

'@Action @SpecificActionます。public void specificMethod(){}' – Michael

+0

関連:https://stackoverflow.com/questions/1624084/why-is-not-possible-to-endend-annotations-in-java – assylias

+0

問題を回避するには、 'String type()デフォルトの "base";または 'boolean isSpecific default false;'をアノテーションに追加します。 –

答えて

3

は注釈が継承することはできませんが、組成物を用いることができ、このように再帰的にターゲットアノテーションを検索し、言う

@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 [email protected](), interface [email protected]()}

+0

アイデア確かに私の心を横切って、私はそれを避け、再帰を書く必要はない方法を探していた。しかし、リンクで言われたように、それはそのような遺産がないことを知って良いです! – ldebroux

関連する問題