I have an annotation and three classes like this:
@Inherited @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation {} @MyAnnotation public class MySuperClass {} public class MySubClassA extends MySuperClass {} @MyAnnotation public class MySubClassB extends MySuperClass {}
Is there any way I can determine if a present annotation is inherited or declared directly at the class?
Something like a method public boolean isInherited(Class<?> clazz, MyAnnotation annotation)
that should only be called if the annotation is present.
Exptected output:
isInherited(MySuperClass.class, MySuperClass.class.getAnnotation(MyAnnotation.class)) --> false isInherited(MySubClassA.class, MySubClassA.class.getAnnotation(MyAnnotation.class)) --> true isInherited(MySubClassB.class, MySubClassB.class.getAnnotation(MyAnnotation.class)) --> false
Advertisement
Answer
You can use getDeclaredAnnotation
instead of getAnnotation
:
public boolean isInherited(Class<?> clazz, Class<? extends Annotation> annotation) { return clazz.isAnnotationPresent(annotation) && clazz.getDeclaredAnnotation(annotation) == null; }