¿Alguien puede explicar de una manera clara las diferencias prácticas entre las java.lang.annotation.RetentionPolicy
constantes SOURCE
, CLASS
y 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.CLASS
apt
está 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.Method
yjava.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
javap
observamos que laRetention.CLASS
clase anotada obtiene un atributo de clase RuntimeInvisible :mientras que la
Retention.RUNTIME
anotación obtiene un atributo de clase RuntimeVisible :y el
Runtime.SOURCE
anotado.class
no 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