Kann jemand die praktischen Unterschiede zwischen den in einer klaren Art und Weise erklärt java.lang.annotation.RetentionPolicy
Konstanten SOURCE
, CLASS
und RUNTIME
?
Ich bin mir auch nicht ganz sicher, was der Ausdruck "Annotation beibehalten" bedeutet.
java
annotations
xdevel2000
quelle
quelle
Antworten:
Quelle: Die alte URL ist jetzt tot
hunter_metaund wurde durch hunter-meta-2-098036 ersetzt . Falls auch dies ausfällt, lade ich das Bild der Seite hoch.Bild (Klicken Sie mit der rechten Maustaste und wählen Sie "Bild in neuem Tab / Fenster öffnen".)
quelle
RetentionPolicy.CLASS
apt
veraltet, lesen Sie bitte diese docs.oracle.com/javase/7/docs/technotes/guides/apt/… . Zum Erkennen von Anmerkungen mithilfe von Reflektion gibt es im Internet mehrere Tutorials. Sie können beginnen, indem Siejava.lang.Class::getAnno*
ähnliche Methoden injava.lang.reflect.Method
und untersuchenjava.lang.reflect.Field
.Nach Ihren Kommentaren zur Klassendekompilierung sollte dies meiner Meinung nach folgendermaßen funktionieren:
RetentionPolicy.SOURCE
: Wird nicht in der dekompilierten Klasse angezeigtRetentionPolicy.CLASS
: Erscheint in der dekompilierten Klasse, kann aber zur Laufzeit nicht mit Reflection with überprüft werdengetAnnotations()
RetentionPolicy.RUNTIME
: Erscheint in der dekompilierten Klasse und kann zur Laufzeit mit Reflection with überprüft werdengetAnnotations()
quelle
Minimal lauffähiges Beispiel
Sprachniveau :
Bytecode-Ebene : Mit
javap
beobachten wir, dass die mitRetention.CLASS
Anmerkungen versehene Klasse ein RuntimeInvisible- Klassenattribut erhält :Während die
Retention.RUNTIME
Annotation ein RuntimeVisible- Klassenattribut erhält :und die
Runtime.SOURCE
Annotation.class
erhält keine Annotation.Beispiele auf GitHub, mit denen Sie spielen können.
quelle
Aufbewahrungsrichtlinie: Eine Aufbewahrungsrichtlinie bestimmt, an welchem Punkt eine Anmerkung verworfen wird. Es wird mithilfe der in Java integrierten Anmerkungen angegeben:
@Retention
[Info]quelle
Oracle Doc
quelle