Минимальный пример
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;
}
Если мы используем javap
для аннотированных классов, мы видим, что аннотированный класс Retention.CLASS
получает атрибут класса RuntimeInvisible :
#14 = Utf8 LRetentionClass;
[...]
RuntimeInvisibleAnnotations:
0: #14()
в то время как аннотация Retention.RUNTIME
получает атрибут класса RuntimeVisible :
#14 = Utf8 LRetentionRuntime;
[...]
RuntimeVisibleAnnotations:
0: #14()
Таким образом, информация присутствует в обоих случаях в байт-коде.
Следовательно, Runtime.CLASS
можно использовать для привязки произвольных метаданных к классу, который могут использовать инструменты манипулирования байт-кодом, не влияя на поведение, видимое во время выполнения.
Примеры на GitHub , с которыми вы можете играть.