Quelqu'un peut -il expliquer de façon claire les différences pratiques entre les java.lang.annotation.RetentionPolicy
constantes SOURCE
, CLASS
, et RUNTIME
?
Je ne sais pas non plus exactement ce que signifie l'expression «retenir l'annotation».
java
annotations
xdevel2000
la source
la source
Réponses:
Source: L'ancienne URL est maintenant morte
hunter_metaet remplacée par hunter-meta-2-098036 . Au cas où même cela tombe en panne, je télécharge l'image de la page.Image (clic droit et sélectionnez `` Ouvrir l'image dans un nouvel onglet / fenêtre '')
la source
RetentionPolicy.CLASS
apt
soit obsolète, reportez-vous à ce docs.oracle.com/javase/7/docs/technotes/guides/apt/… . Pour découvrir les annotations à l'aide de la réflexion, il existe plusieurs didacticiels sur Internet. Vous pouvez commencer par rechercherjava.lang.Class::getAnno*
des méthodes similaires dansjava.lang.reflect.Method
etjava.lang.reflect.Field
.D'après vos commentaires sur la décompilation de classe, voici comment je pense que cela devrait fonctionner:
RetentionPolicy.SOURCE
: N'apparaîtra pas dans la classe décompiléeRetentionPolicy.CLASS
: Apparaît dans la classe décompilée, mais ne peut pas être inspecté au moment de l'exécution avec une réflexion avecgetAnnotations()
RetentionPolicy.RUNTIME
: Apparaissent dans la classe décompilée et peuvent être inspectés au moment de l'exécution avec réflexion avecgetAnnotations()
la source
Exemple exécutable minimal
Niveau de langue :
Niveau Bytecode : en utilisant
javap
nous observons que laRetention.CLASS
classe annotée obtient un attribut de classe RuntimeInvisible :tandis que l'
Retention.RUNTIME
annotation obtient un attribut de classe RuntimeVisible :et l'
Runtime.SOURCE
annoté.class
n'obtient aucune annotation.Exemples sur GitHub avec lesquels vous pouvez jouer.
la source
Politique de rétention: une politique de rétention détermine à quel moment une annotation est supprimée. Il est spécifié à l'aide des annotations intégrées de Java:
@Retention
[About]la source
Doc Oracle
la source