Java Language Definizione dei tipi di annotazione


Esempio

I tipi di annotazione sono definiti con @interface . I parametri sono definiti come i metodi di un'interfaccia regolare.

@interface MyAnnotation {
    String param1();
    boolean param2();
    int[] param3();  // array parameter 
}

Valori standard

@interface MyAnnotation {
    String param1() default "someValue";
    boolean param2() default true;
    int[] param3() default {};
}

Meta-Annotazioni

Le meta-annotazioni sono annotazioni che possono essere applicate ai tipi di annotazione. Una speciale meta-annotazione predefinita definisce come possono essere usati i tipi di annotazione.

@Bersaglio

La meta-annotazione @Target limita i tipi a cui può essere applicata l'annotazione.

@Target(ElementType.METHOD)
@interface MyAnnotation {
    // this annotation can only be applied to methods
}

È possibile aggiungere più valori utilizzando la notazione array, ad esempio @Target({ElementType.FIELD, ElementType.TYPE})

Valori disponibili

ElementType bersaglio esempio di utilizzo sull'elemento target
ANNOTATION_TYPE tipi di annotazione
@Retention(RetentionPolicy.RUNTIME) 
@interface MyAnnotation
COSTRUTTORE costruttori
@MyAnnotation
public MyClass() {}
CAMPO campi, costanti enum
@XmlAttribute
private int count;
LOCAL_VARIABLE dichiarazioni variabili all'interno dei metodi
for (@LoopVariable int i = 0; i < 100; i++) {
@Unused
String resultVariable;
}
PACCHETTO pacchetto (in package-info.java )
@Deprecated
package very.old;
METODO metodi
@XmlElement
public int getCount() {...}
PARAMETRO parametri metodo / costruttore
public Rectangle(
@NamedArg("width") double width,
@NamedArg("height") double height) {
...
}
GENERE classi, interfacce, enumerazioni
@XmlRootElement
public class Report {}
Java SE 8
ElementType bersaglio esempio di utilizzo sull'elemento target
TYPE_PARAMETER Digitare dichiarazioni dei parametri
public <@MyAnnotation T> void f(T t) {}
TYPE_USE Uso di un tipo
Object o = "42";
String s = (@MyAnnotation String) o;

@Ritenzione

La meta-annotazione @Retention definisce la visibilità dell'annotazione durante il processo di compilazione delle applicazioni o l'esecuzione. Per impostazione predefinita, le annotazioni sono incluse nei file .class , ma non sono visibili in fase di runtime. Per rendere accessibile un'annotazione in fase di esecuzione, RetentionPolicy.RUNTIME deve essere impostato su tale annotazione.

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
    // this annotation can be accessed with reflections at runtime
}

Valori disponibili

RetentionPolicy Effetto
CLASSE L'annotazione è disponibile nel file .class , ma non in fase di runtime
DURATA L'annotazione è disponibile in runtime e si può accedere tramite riflessione
FONTE L'annotazione è disponibile in fase di compilazione, ma non aggiunta ai file .class . L'annotazione può essere utilizzata ad esempio da un processore di annotazione.

@Documented

La meta-annotazione @Documented viene utilizzata per contrassegnare annotazioni il cui utilizzo dovrebbe essere documentato da generatori di documentazione API come javadoc . Non ha valori. Con @Documented , tutte le classi che utilizzano l'annotazione lo elencheranno nella pagina della documentazione generata. Senza @Documented , non è possibile vedere quali classi utilizzano l'annotazione nella documentazione.

@Ereditato

La meta-annotazione @Inherited è pertinente alle annotazioni applicate alle classi. Non ha valori. Contrassegnare un'annotazione come @Inherited altera il modo in cui funziona la query di annotazione.

  • Per un'annotazione non ereditata, la query esamina solo la classe esaminata.
  • Per un'annotazione ereditata, la query controlla anche la catena super-classe (in modo ricorsivo) finché non viene trovata un'istanza dell'annotazione.

Si noti che vengono interrogate solo le super classi: eventuali annotazioni associate alle interfacce nella gerarchia delle classi verranno ignorate.

@Ripetibile

@Repeatable La meta-annotazione @Repeatable stata aggiunta in Java 8. Indica che più istanze dell'annotazione possono essere associate alla destinazione dell'annotazione. Questa meta-annotazione non ha valori.