Annotation

S

susu123

Mitglied
Können alle Annotation zur Laufzeit ausgewertet werden? Bitte mit Begründung
 
H

httpdigest

Top Contributor
Annotationen können per Java Core Reflection API zur Laufzeit abgefragt werden, wenn sie "runtime-visible" sind. Genauer gesagt, wenn die ClassFile-, field_info- oder method_info-Struktur das RuntimeVisibleAnnotations Attribut für die Stelle, an der die Annotation verwendet wurde, besitzt.
Für Annotationen an Parametern (seit Java 8) gibt es das RuntimeVisibleParameterAnnotations classfile Attribut.

Das heisst, obwohl unterschiedliche mit derselben Annotation annotierte Stellen laut Java Class File Format verschiedene/individuelle runtime visibilities haben können, generiert der Java Compiler aber dieselbe Visibility Information (anhand der @Retention Annotation) an alle annotierten Stellen.

Du kannst also z.B. eine Annotation (@interface) definieren, und dieser Deklaration eine Annotation @Retention(RetentionPolicy.RUNTIME) geben. Dann ist sie an allen Stellen, wo du diese Annotation verwendest, auch zur Laufzeit per Java Core Reflection API "sichtbar".

Verwendest du nur @Retention(RetentionPolicy.CLASS), dann ist die Annotation zwar noch in dem RuntimeInvisibleAnnotations classfile Attribut genannt, also im Classfile selbst enthalten, aber nicht mehr per Java Core Reflection API zur Laufzeit abfragbar.
Du kannst solche Annotationen aber natürlich immer noch zur Laufzeit per Bytecode Library (z.B. ASM, Javassist, BCEL oder Byte Buddy) parsen und dadurch abfragen.

Verwendest du @Retention(SOURCE) oder gar keine @Retention Annotation, dann sind die annotierten Stellen auch nicht mehr im Classfile markiert und verschwinden gänzlich.
 
Zuletzt bearbeitet:

Ähnliche Java Themen


Oben