Is it possible for class to inherit the annotations of the super class
Annotation inheritance works basically the same way as inheritance of methods or fields.
Since you can access annotations only through reflection, there are two basic methods in Class
:
getAnnotations()
returns all annotations on the current class and its super classesgetDeclaredAnnotations()
returns all annotations on the current class
The problem the article you linked talks about is that Method#getAnnotation(...)
accesses declaredAnnotations()
of the class the method has been defined in, which as stated above only returns the annotations defined in that class and not those of the super classes.
This means that if you override one of the methods annotated with @Transactional
you'd have to add the annotation there (or if the frameworks also looks in the class annotation it should find the @Transactional
declared on AbstractMaqraaService
).
Yes it is possible if the annotation has @Inherited
added to it. For example, the @Transactional
annotation has @Inherited
.
From the docs:
Indicates that an annotation type is automatically inherited. If an Inherited meta-annotation is present on an annotation type declaration, and the user queries the annotation type on a class declaration, and the class declaration has no annotation for this type, then the class's superclass will automatically be queried for the annotation type. This process will be repeated until an annotation for this type is found, or the top of the class hierarchy (Object) is reached. If no superclass has an annotation for this type, then the query will indicate that the class in question has no such annotation.
Note that this meta-annotation type has no effect if the annotated type is used to annotate anything other than a class. Note also that this meta-annotation only causes annotations to be inherited from superclasses; annotations on implemented interfaces have no effect.
Docs of @Transactional
:
@Target(value={METHOD,TYPE}) @Retention(value=RUNTIME) @Inherited @Documented public @interface Transactional
Off topic: You cannot subtype an annotation though in Java.