Mínimo ejemplo ejecutable
nivel de idioma:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.SOURCE)
@interface RetentionSource {}
@Retention(RetentionPolicy.CLASS)
@interface RetentionClass {}
@Retention(RetentionPolicy.RUNTIME)
@interface RetentionRuntime {}
public static void main(String[] args) {
@RetentionSource
class B {}
assert B.class.getAnnotations().length == 0;
@RetentionClass
class C {}
assert C.class.getAnnotations().length == 0;
@RetentionRuntime
class D {}
assert D.class.getAnnotations().length == 1;
}
nivel Bytecode: usando javap
observamos que la clase anotada Retention.CLASS
consigue un atributo RuntimeInvisible clase:
#14 = Utf8 LRetentionClass;
[...]
RuntimeInvisibleAnnotations:
0: #14()
mientras Retention.RUNTIME
anotación consigue un atributo RuntimeVisible clase:
#14 = Utf8 LRetentionRuntime;
[...]
RuntimeVisibleAnnotations:
0: #14()
y la Runtime.SOURCE
anotado .class
no obtiene ninguna anotación.
Examples on GitHub para que juegues con.
La documentación (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/annotation/RetentionPolicy.html) es muy clara. –
sí, ya lo leí pero no entiendo en la práctica cómo funciona. De hecho, si intento 'esta frase': "" "" El compilador debe registrar las anotaciones en el archivo de clase, pero no es necesario que la VM las retenga en tiempo de ejecución."" " y luego abra una clase decompilada donde puse una anotación con la política de retención CLASE I no encuentro nada ... – xdevel2000
Entonces su decompilador no parece ser compatible con las anotaciones. Jd-gui funciona bien. – musiKk