Alguém pode explicar de forma clara as diferenças práticas entre os java.lang.annotation.RetentionPolicy
constantes SOURCE
, CLASS
, e RUNTIME
?
Também não sei exatamente o que significa a frase "retendo anotação".
java
annotations
xdevel2000
fonte
fonte
Respostas:
Origem: o URL antigo está morto agora
hunter_metae substituído por hunter-meta-2-098036 . Caso isso aconteça, estou carregando a imagem da página.Imagem (Clique com o botão direito do mouse e selecione 'Abrir imagem em uma nova guia / janela')
fonte
RetentionPolicy.CLASS
apt
sido descontinuado, consulte este documentos.oracle.com/javase/7/docs/technotes/guides/apt/… . Para descobrir anotações usando reflexão, existem vários tutoriais na Internet. Você pode começar examinandojava.lang.Class::getAnno*
métodos semelhantes emjava.lang.reflect.Method
ejava.lang.reflect.Field
.De acordo com seus comentários sobre a descompilação de classes, aqui está como eu acho que deve funcionar:
RetentionPolicy.SOURCE
: Não aparecerá na classe descompiladaRetentionPolicy.CLASS
: Aparece na classe descompilada, mas não pode ser inspecionada em tempo de execução com reflexão comgetAnnotations()
RetentionPolicy.RUNTIME
: Aparecem na classe descompilada e podem ser inspecionados em tempo de execução com reflexão comgetAnnotations()
fonte
Exemplo mínimo executável
Nível de idioma :
Nível de bytecode : usando
javap
, observamos que aRetention.CLASS
classe anotada recebe um atributo de classe RuntimeInvisible :enquanto a
Retention.RUNTIME
anotação obtém um atributo de classe RuntimeVisible :e o
Runtime.SOURCE
anotado.class
não recebe nenhuma anotação.Exemplos no GitHub para você brincar.
fonte
Política de retenção: uma política de retenção determina em que momento uma anotação é descartada. É especificado usando as anotações internas do Java:
@Retention
[Sobre]fonte
Documento Oracle
fonte