有没有像在Java中的注释inheritance?

我正在探索注释,并且发现一些注释似乎在其中有层次结构。

我使用注释在卡片的背景中生成代码。 有不同的卡片types(因此不同的代码和注释),但是它们之间有一些常见的元素,如名称。

@Target(value = {ElementType.TYPE}) public @interface Move extends Page{ String method1(); String method2(); } 

这将是常见的注释:

 @Target(value = {ElementType.TYPE}) public @interface Page{ String method3(); } 

在上面的例子中,我期望移动inheritance方法3,但我得到一个警告,说延伸是无效的注释。 我试图让一个注释扩展一个共同的基础之一,但这是行不通的。 这是甚至可能或只是一个devise问题?

很不幸的是,不行。 显然,这与程序读取一个类的注释而不加载它们有关。 请参阅为什么不能在Java中扩展注释?

但是,如果这些注释是@Inherited ,则types会inheritance其超类的注释。

另外,除非您需要这些方法进行交互,否则您可以在您的课堂上堆叠注释:

 @Move @Page public class myAwesomeClass {} 

有没有理由不适合你?

您可以使用基本注释而不是inheritance注释注释。 这在Spring框架中使用 。

举个例子

 @Target(value = {ElementType.ANNOTATION_TYPE}) public @interface Vehicle { } @Target(value = {ElementType.TYPE}) @Vehicle public @interface Car { } @Car class Foo { } 

然后你可以使用Spring的AnnotationUtils来检查一个类是否被Vehicle 注释过 :

 Vehicle vehicleAnnotation = AnnotationUtils.findAnnotation (Foo.class, Vehicle.class); boolean isAnnotated = vehicleAnnotation != null; 

这个方法实现为:

 public static <A extends Annotation> A findAnnotation(Class<?> clazz, Class<A> annotationType) { return findAnnotation(clazz, annotationType, new HashSet<Annotation>()); } @SuppressWarnings("unchecked") private static <A extends Annotation> A findAnnotation(Class<?> clazz, Class<A> annotationType, Set<Annotation> visited) { try { Annotation[] anns = clazz.getDeclaredAnnotations(); for (Annotation ann : anns) { if (ann.annotationType() == annotationType) { return (A) ann; } } for (Annotation ann : anns) { if (!isInJavaLangAnnotationPackage(ann) && visited.add(ann)) { A annotation = findAnnotation(ann.annotationType(), annotationType, visited); if (annotation != null) { return annotation; } } } } catch (Exception ex) { handleIntrospectionFailure(clazz, ex); return null; } for (Class<?> ifc : clazz.getInterfaces()) { A annotation = findAnnotation(ifc, annotationType, visited); if (annotation != null) { return annotation; } } Class<?> superclass = clazz.getSuperclass(); if (superclass == null || Object.class == superclass) { return null; } return findAnnotation(superclass, annotationType, visited); } 

AnnotationUtils还包含用于在方法和其他注释元素上search注释的其他方法。 Spring类也足够强大,可以search桥接方法,代理和其他angular落情况,特别是在Spring中遇到的情况。

除了Grygoriys注解注释的答案。

你可以通过这个循环来检查例如包含@Qualifier批注(或用@Qualifier批注的批注)的方法:

 for (Annotation a : method.getAnnotations()) { if (a.annotationType().isAnnotationPresent(Qualifier.class)) { System.out.println("found @Qualifier annotation");//found annotation having Qualifier annotation itself } } 

你基本上做的是获得所有的注释出现在方法和这些注释你得到他们的types,并检查这些types,如果他们用@Qualifier注释。 您的注释需要启用Target.Annotation_type以使其正常工作。