with tutorial notacion define crear annotation java annotations

tutorial - Anotaciones de Java: buscando un ejemplo de RetentionPolicy.CLASS



notacion en java (4)

de acuerdo con Java Annotation API:

  • RetentionPolicy.CLASS Las anotaciones deben ser registradas en el archivo de clase por el compilador, pero no es necesario que la VM las retenga en tiempo de ejecución.

  • RetentionPolicy.RUNTIME Las anotaciones deben ser registradas en el archivo de clase por el compilador y retenidas por la VM en tiempo de ejecución, por lo que pueden leerse de manera reflexiva.

Estoy buscando una muestra de política de retención "CLASE". cuando necesitamos usar esta política en lugar de la política RUNTIME.


De todas las gran cantidad de bibliotecas que tengo en mi proyecto actual. los únicos ejemplos que puedo encontrar están en la biblioteca de Google Guava , por ejemplo com.google.common.annotations.GwtCompatible .

Aunque no estoy seguro de por qué eligieron esta política de retención, quizás para el soporte de herramientas, donde las herramientas leen los archivos de clase, en lugar de pasar por la API de reflexión. Sin embargo, no estoy seguro de que realmente vea el objetivo de esta distinción.


Las anotaciones CLASS se usan en herramientas de ofuscación como http://proguard.sourceforge.net . Por ejemplo, la anotación @KeepName desactiva el cambio de nombre de los nombres cuando necesita que su nombre de clase no se modifique para poder llamar a métodos como Class.forName ().



Ejemplo mínimo de cómo funciona de manera diferente en el lenguaje:

import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.CLASS) @interface RetentionClass {} @Retention(RetentionPolicy.RUNTIME) @interface RetentionRuntime {} public static void main(String[] args) { @RetentionClass class C {} assert C.class.getAnnotations().length == 0; @RetentionRuntime class D {} assert D.class.getAnnotations().length == 1; }

Si usamos javap en las clases anotadas, vemos que la clase anotada Retention.CLASS obtiene un atributo de clase RuntimeInvisible :

#14 = Utf8 LRetentionClass; [...] RuntimeInvisibleAnnotations: 0: #14()

mientras que la anotación Retention.RUNTIME obtiene un atributo de clase RuntimeVisible :

#14 = Utf8 LRetentionRuntime; [...] RuntimeVisibleAnnotations: 0: #14()

Entonces, la información está presente en ambos casos en el bytecode.

Por lo tanto, Runtime.CLASS se puede usar para asociar metadatos arbitrarios a una clase que las herramientas de manipulación de códigos de bytes pueden usar, sin interferir con el comportamiento visible en tiempo de ejecución.

Ejemplos en GitHub para que juegues.