In my project I use pre-defined annotation @With
:
@With(Secure.class) public class Test { //....
The source code of @With
:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface With { Class<?>[] value() default {}; }
I want to write custom annotation @Secure
, which will have the same effect as @With(Secure.class)
. How to do that?
What if I do like this? Will it work?
@With(Secure.class) @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Secure { }
In Java SE 6, annotations cannot subclass one another, and an annotation is not allowed to extend/implement any interfaces.
@inherited is a type of meta-annotation used to annotate custom annotations so that the subclass can inherit those custom annotations.
Annotation is defined like a ordinary Java interface, but with an '@' preceding the interface keyword (i.e., @interface ). You can declare methods inside an annotation definition (just like declaring abstract method inside an interface). These methods are called elements instead.
If an @Target meta-annotation is present, the compiler will enforce the usage restrictions indicated by ElementType enum constants, in line with JLS 9.7. 4. For example, this @Target meta-annotation indicates that the declared type is itself a meta-annotation type.
As piotrek pointed out, you cannot extend Annotations in the sense of inheritance. Still, you can create Annotations that aggregate others:
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) public @interface SuperAnnotation { String value(); } @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) public @interface SubAnnotation { SuperAnnotation superAnnotation(); String subValue(); }
Usage:
@SubAnnotation(subValue = "...", superAnnotation = @SuperAnnotation(value = "superValue")) class someClass { ... }
From Java language specification, Chapter 9.6 Annotation Types:
No extends clause is permitted. (Annotation types implicitly extend
annotation.Annotation
.)
So, you can not extend an Annotation. you need to use some other mechanism or create a code that recognize and process your own annotation. Spring allows you to group other Spring's annotation in your own custom annotations. but still, no extending.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With