In diesem Artikel werden hauptsächlich relevante Informationen zum Annotationsmechanismus und seinen Prinzipien in Java vorgestellt. Ich hoffe, dass dieser Artikel jedem helfen kann, diesen Teil des Inhalts zu verstehen und zu beherrschen
Detaillierte Erläuterung des Annotationsmechanismus und seiner Prinzipien in Java
Was sind Annotationen?
Annotationen werden auch Metadaten genannt, wie zum Beispiel unser gemeinsames @Override und @ Veraltet, Annotation ist eine Funktion, die in der JDK1.5-Version eingeführt wurde. Sie dient zur Erläuterung des Codes. Sie kann Pakete, Klassen, Schnittstellen, Felder, Methodenparameter, lokale Variablen usw. annotieren. Seine Hauptfunktionen sind wie folgt:
Generieren Sie Dokumente und generieren Sie Javadoc-Dokumente mithilfe der im Code identifizierten Metadaten.
Kompilierungsprüfung: Die im Code identifizierten Metadaten ermöglichen dem Compiler eine Überprüfung und Verifizierung während der Kompilierung.
Dynamische Verarbeitung zur Kompilierungszeit Dynamische Verarbeitung zur Kompilierungszeit durch die im Code identifizierten Metadaten, z. B. dynamisches Generieren von Code.
Dynamische Verarbeitung zur Laufzeit Dynamische Verarbeitung zur Laufzeit durch im Code identifizierte Metadaten, z. B. mithilfe von Reflection-Injection-Instanzen.
Allgemeine Anmerkungen können in drei Kategorien unterteilt werden:
Die erste Kategorie sind Javas eigene Standardanmerkungen, einschließlich @Override, @ Veraltet und @SuppressWarnings werden verwendet, um das Überschreiben einer Methode anzugeben, um anzuzeigen, dass eine bestimmte Klasse oder Methode veraltet ist, und um anzuzeigen, dass Warnungen ignoriert werden sollen. Der Compiler führt eine Überprüfung durch, nachdem er mit diesen Anmerkungen markiert wurde.
Eine Kategorie sind Meta-Anmerkungen, die zum Definieren von Anmerkungen verwendet werden, einschließlich @Retention, @Target, @Inherited, @Documented, und @Retention wird verwendet, um dies anzuzeigen Anmerkungen bleiben erhalten. @Target wird verwendet, um den Verwendungsbereich von Anmerkungen anzugeben, @Inherited wird verwendet, um anzugeben, dass Anmerkungen vererbt werden können, und @Documented wird verwendet, um anzugeben, ob ein Javadoc-Dokument generiert werden soll.
Der erste Typ sind benutzerdefinierte Anmerkungen. Sie können Anmerkungen entsprechend Ihren eigenen Anforderungen definieren und Metaanmerkungen verwenden, um benutzerdefinierte Anmerkungen zu kommentieren.
Verwendung von Anmerkungen
Die Verwendung von Anmerkungen ist sehr einfach. Sie müssen eine Anmerkung nur dort markieren, wo eine Anmerkung erforderlich ist.
public class Test { @Override public String tostring() { return "override it"; } }
Zum Beispiel Anmerkungen zur Klasse machen:
@Deprecated public class Test { }
Also die integrierten Anmerkungen In Java kann es direkt verwendet werden, aber oft müssen wir einige Annotationen selbst definieren. Beispielsweise verwendet die gemeinsame Feder eine große Anzahl von Annotationen, um Abhängigkeiten zwischen Objekten zu verwalten. Schauen wir uns an, wie man eine eigene Annotation definiert. Lassen Sie uns eine solche Annotation implementieren: Fügen Sie über @Test eine Zeichenfolge in eine bestimmte Klasse ein und über @TestMethod eine Zeichenfolge in eine bestimmte Methode.
① Erstellen Sie eine Testanmerkung, deklarieren Sie sie als Aktion für die Klasse und behalten Sie sie bis zur Laufzeit bei.
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Test { String value() default "default"; }
② Erstellen Sie eine TestMethod-Annotation, deklarieren Sie sie als Reaktion auf die Methode und behalten Sie sie bis zur Laufzeit bei.
@Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface TestMethod { String value(); }
③Die Testklasse gibt nach der Ausführung zwei Zeichenfolgen aus, Standard und Tomcat-Methode. Da @Test keinen Wert übergibt, wird der Standardwert ausgegeben. und @TestMethod gibt die eingefügte Zeichenfolge aus.
@Test() public class AnnotationTest { @TestMethod("tomcat-method") public void test(){ } public static void main(String[] args){ Test t = AnnotationTest.class.getAnnotation(Test.class); System.out.println(t.value()); TestMethod tm = null; try { tm = AnnotationTest.class.getDeclaredMethod("test",null).getAnnotation(TestMethod.class); } catch (Exception e) { e.printStackTrace(); } System.out.println(tm.value()); } }
Das Prinzip der Anmerkungen
Im vorherigen Artikel wurde erläutert, wie Sie die in Java integrierten Anmerkungen verwenden und anpassen Werfen wir einen Blick auf die Prinzipien der Annotationsimplementierung und sehen wir uns an, wie Annotationen im größeren Java-System unterstützt werden. Kehren wir für den Annotationstest wie folgt zurück: Wenn die AnnotationTest-Klasse mit Annotationen versehen ist, kann der Wert der Annotationsdeklaration zur Laufzeit über AnnotationTest.class.getAnnotation(Test.class) abgerufen werden Im obigen Satz können Sie sehen, dass die Testanmerkung aus der Klassenstruktur abgerufen wird. Daher muss die Anmerkung irgendwann zur Klassenstruktur hinzugefügt worden sein.
@Test("test") public class AnnotationTest { public void test(){ } }
Die Konvertierung von Java-Quellcode in Klassenbytecode wird vom Compiler abgeschlossen. Der Compiler analysiert den Java-Quellcode und generiert Klassendateien sowie die Anmerkungen auch in Es wird vom Compiler während der Kompilierung verarbeitet und an die Klassenstruktur angehängt. Gemäß der JVM-Spezifikation ist die Klassendateistruktur die einzige Möglichkeit, Informationen anzufügen Die Klassenstruktur besteht darin, sie im Attributattribut der Struktur in der Klasse zu speichern. Wir wissen, dass Klassen, Felder und Methoden ihre eigenen spezifischen Tabellenstrukturen in der Klassenstruktur haben und jede ihre eigenen Attribute hat. Auch ihr Wirkungsbereich kann unterschiedlich sein. Sie können auf Klassen oder auf ein Feld wirken oder Methode speichert der Compiler die Anmerkungsinformationen in den Eigenschaften der Klasse, des Felds oder der Methode.
Nachdem unsere AnnotationTest-Klasse kompiliert wurde, enthält die entsprechende AnnotationTest.class-Datei ein RuntimeVisibleAnnotations-Attribut. Da diese Annotation auf die Klasse angewendet wird, wird dieses Attribut dem Attributsatz der Klasse hinzugefügt. Das heißt, das Schlüssel-Wert-Paar value=test der Test-Annotation wird aufgezeichnet. Wenn die JVM den Bytecode der Datei AnnotationTest.class lädt, speichert sie den Attributwert RuntimeVisibleAnnotations im Klassenobjekt von AnnotationTest, sodass das Testannotationsobjekt über AnnotationTest.class.getAnnotation(Test.class) und dann über abgerufen werden kann Das Test-Annotationsobjekt ruft die Attributwerte in Test ab.
Möglicherweise haben Sie hier Fragen: Was ist das Testanmerkungsobjekt? Tatsächlich ist die Essenz der kompilierten Annotation eine Schnittstelle, die die Annotation-Schnittstelle erbt, also ist @Test eigentlich „öffentliche Schnittstelle Test erweitert Annotation“. Wenn wir sie über AnnotationTest.class.getAnnotation (Test.class) aufrufen, wird das JDK dies tun Generieren Sie es über einen dynamischen Proxy. Ein Objekt, das die Testschnittstelle implementiert und den RuntimeVisibleAnnotations-Attributwert in diesem Objekt festlegt. Dieses Objekt ist das Test-Annotationsobjekt, und der Annotationswert kann über seine value()-Methode abgerufen werden.
Der gesamte Prozess des Java-Annotationsimplementierungsmechanismus ist wie oben gezeigt. Seine Implementierung erfordert die Zusammenarbeit des Compilers und der JVM.
Das obige ist der detaillierte Inhalt vonDetaillierte Beispiele für Annotationsmechanismen und -prinzipien in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!