私の問題は次のとおりです。注釈を使用してクラスのメソッドにタグを付けています。メソッド注釈継承
私の主な注釈は@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のリンク@として
'@Action @SpecificActionます。public void specificMethod(){}' – Michael
関連:https://stackoverflow.com/questions/1624084/why-is-not-possible-to-endend-annotations-in-java – assylias
問題を回避するには、 'String type()デフォルトの "base";または 'boolean isSpecific default false;'をアノテーションに追加します。 –