¿Alguien puede explicar de una manera clara las diferencias prácticas entre las java.lang.annotation.RetentionPolicyconstantes SOURCE, CLASSy RUNTIME?
Tampoco estoy exactamente seguro de lo que significa la frase "retener la anotación".
java
annotations
xdevel2000
fuente
fuente

Respuestas:
Fuente: la antigua URL está muerta ahora
hunter_metay reemplazada por hunter-meta-2-098036 . En caso de que incluso esto se caiga, estoy cargando la imagen de la página.Imagen (haga clic con el botón derecho y seleccione 'Abrir imagen en nueva pestaña / ventana')
fuente
RetentionPolicy.CLASSaptestá en desuso, consulte docs.oracle.com/javase/7/docs/technotes/guides/apt/… . Para descubrir anotaciones usando la reflexión, hay múltiples tutoriales en internet. Puede comenzar buscandojava.lang.Class::getAnno*y métodos similares enjava.lang.reflect.Methodyjava.lang.reflect.Field.Según sus comentarios sobre la descompilación de clases, así es como creo que debería funcionar:
RetentionPolicy.SOURCE: No aparecerá en la clase descompiladaRetentionPolicy.CLASS: Aparece en la clase descompilada, pero no se puede inspeccionar en tiempo de ejecución con reflexión congetAnnotations()RetentionPolicy.RUNTIME: Aparece en la clase descompilada y se puede inspeccionar en tiempo de ejecución con reflexión congetAnnotations()fuente
Ejemplo ejecutable mínimo
Nivel de idioma :
Nivel de código de bytes : mediante el uso
javapobservamos que laRetention.CLASSclase anotada obtiene un atributo de clase RuntimeInvisible :mientras que la
Retention.RUNTIMEanotación obtiene un atributo de clase RuntimeVisible :y el
Runtime.SOURCEanotado.classno recibe ninguna anotación.Ejemplos en GitHub para que juegues.
fuente
Política de retención: una política de retención determina en qué momento se descarta una anotación. Se especifica utilizando las anotaciones incorporadas de Java:
@Retention[Acerca de]fuente
Oracle Doc
fuente