Das Wort „Annotation“ kommt in der JavaProgrammierung häufig vor und ist auch ein häufiges Thema. Als wir zuvor über Spring-bezogene Dinge gesprochen haben, gab es überall Anmerkungen. Wir haben zuvor kurz über einige „Anmerkungen“-bezogene Inhalte gesprochen, beispielsweise wie man „Anmerkungen“ in Spring kombiniert. Da Annotationen in der Java-Programmierung immer noch eine relativ große Rolle spielen, werden wir in unserem heutigen Blog eine systematische Einführung in Annotationen geben. Natürlich werden wir uns dabei auf konkrete Beispiele stützen.
Um es ganz klar auszudrücken: „Annotationen“ sind eine Möglichkeit, Daten zu speichern Wenn Annotationen einzeln verwendet werden, sind ihre Funktionen durchschnittlich Mechanismus“, Dann gibt es noch viel mehr, was getan werden kann. Mit anderen Worten: Sie können die durch „Anmerkungen“ bereitgestellten Informationen durch Reflexion lesen und dann etwas tun, das Ihren spezifischen Anforderungen entspricht. Natürlich haben wir früher XML verwendet, um Informationen für den Reflexionsmechanismus bereitzustellen. Allerdings verfügt die Konfiguration von „XML“ immer noch nicht über die Datenform von „Annotationen“, die einfach zu verwalten und zu warten ist Der Status von „Anmerkungen“ ist immer noch relativ wichtig.
Im Folgenden werden wir zunächst über „Meta-Anmerkungen“ sprechen und dann Anmerkungen basierend auf diesen „Meta-Anmerkungen“ anpassen und Javas „Reflexionsmechanismus“ verwenden, um verschiedene Arten von Anmerkungsinformationen zu lesen .
1. Meta-Anmerkung
Im ersten Teil dieses Blogs werfen wir einen Gesamtblick„Meta-Anmerkungen“, und dann wird der unten stehende Inhalt basierend auf diesen Meta-Anmerkungen erweitert.
1. @Target
Verwendung: @Target(ElementType . CONSTRUCTOR)
@TargetDer chinesische Name von Target ist „Ziel, Standort “ bedeutet, die Bedeutung zu kennen, nachdem man den Namen gesehen hat. @Target wird verwendet, um den Speicherort der von uns erstellten Annotation anzugeben, d. h. welche Art von Elementen die von uns erstellte Annotation ändern kann. Der Parameter von @Target ist eine Aufzählung von ElementType, und jedes Aufzählungselement stellt eine Position dar. Nachfolgend sind einige der am häufigsten verwendeten Werte der ElementType-Enumeration aufgeführt:
TYPE: Klasse. Wenn der Parameter von @Target TYPE ist, dann die Annotation Wir können nur modifizierte Klassen, Schnittstellen, Aufzählungen und andere Typen erstellen.
FELD: Feldänderung Wenn unsere benutzerdefinierte Annotation vom Typ FIELD ist, kann unsere Annotation nur zum Ändern von Feldern von Klassen oder Aufzählungen verwendet werden. Mitglied Variable .
CONSTRUCTOR: Konstruktortyp, die „Anmerkungen“ dieses Typs können nur den Konstruktor ändern.
METHOD: Anmerkung, die „Methode“ ändert.
PARAMETER: Annotation, die die Parameter in der „Methode“ ändert.
LOCAL_VARIABLE: Annotation, die „lokale Variablen“ ändert.
Das Obige ist natürlich eine kurze Diskussion, und im Folgenden werden spezifische Beispiele für die oben genannten Arten von Anmerkungen gegeben. Der Screenshot unten zeigt alle Optionen in ElementType und die Rolle jedes Aufzählungswerts. Die Details sind wie folgt. Die beiden unteren sind die neu hinzugefügten Aufzählungselemente nach 1.8, wie folgt:
2. @Retention
Verwendung: @Retention(RetentionPolicy.RUNTIME)
Oben wird beschrieben, wie man @Retention verwendet. Die chinesische Bedeutung von Retention ist „Retention“, d. h. die Meta-Annotation gibt die Aufbewahrungsdauer der „Annotation“ an. @Retention empfängt auch einen Parameter eines Aufzählungstyps. Unten ist der in der Aufzählung enthaltene Typ aufgeführt. Die englische -Anmerkung unten gibt speziell die Bedeutung jedes Aufzählungselements an.
QUELLE: Dies bedeutet, dass unsere Anmerkungen nur in unserem Quellcode verbleiben und nicht kompiliert werden.
CLASS: Zeigt an, dass unsere Anmerkungen in Bytecode kompiliert und in der Datei .class gespeichert werden Es wird nicht verknüpft und in der virtuellen Maschine ausgeführt.
LAUFZEIT: Dies bedeutet, dass unsere Anmerkungen bis zur Laufzeit des Programms beibehalten werden, wenn Sie etwas über den Reflexionsmechanismus basierend auf den Anmerkungsinformationen tun möchten zur Laufzeit Wenn ja, müssen wir unsere Anmerkungen bis zu diesem Zeitpunkt aufbewahren.
3. @Document und @Inherited
Diese beiden Anmerkungen sind relativ einfach. @Document zeigt an, dass diese Anmerkung in Javadoc enthalten ist, während @Inherited bedeutet, dass dies der Fall ist Diese Annotation kann von Unterklassen geerbt werden.
Die obige Einführung ist möglicherweise etwas abstrakt. Als Nächstes verwenden wir den Reflexionsmechanismus, um die entsprechenden Arten benutzerdefinierter Anmerkungen anhand von Beispielen zu betreiben.
2. Einführung in Testfälle
Der Screenshot unten ist die beteiligte Demo Dieses Blog-Verzeichnis und die Hauptoperationsklassen.
AnnotationTracker: Diese Klasse ist dafür verantwortlich, das Objekt des entsprechenden Annotationstyps und die zugehörigen Informationen in der Annotation über Javas „ Reflexionsmechanismus“ . In der AnnotationTracker-Klasse gibt es alle statischen -Methoden. Die statischen Methoden werden in der entsprechenden annotationsmodifizierten Klasse übergeben. Die allgemeine Struktur ist wie folgt.
CE…Annotation: Bei diesen Klassen handelt es sich um verschiedene Arten von Annotationen, auf die wir später im Detail eingehen werden.
TestClass: Diese Klasse ist die durch die Annotation geänderte Testklasse.
Main: Die Ausführungsmethode unseres Testfalls für diese Demo.
3. Geben Sie die Anmerkung ein: @Target( ElementType.TYPE)
Als nächstes werfen wir einen Blick auf die Erstellung und Verwendung von Typanmerkungen. Im folgenden Inhalt erstellen wir eine Annotation vom Änderungstyp, fügen dann die Änderung der Annotation zur entsprechenden Klasse hinzu und verwenden schließlich den Reflexionsmechanismus von Java, um die entsprechenden Annotationsinformationen zu erhalten.
1. Erstellen Sie eine Anmerkung
Erstellen Sie zunächst unsere Anmerkung: Wählen Sie Anmerkung Klicken Sie einfach beim Namen der Anmerkung auf die Eingabetaste.
Der folgende Codeausschnitt ist der detaillierte Inhalt der erstellten Anmerkung. Wir können sehen, dass die Parameter der Metaannotation @Target vom Typ ElementType.TYPE sind. Dies bedeutet, dass es sich bei der von uns erstellten Annotation um eine Annotation vom Änderungstyp handelt, bei der es sich um bereichsbezogene Klassen, Schnittstellen, Aufzählungen und andere Typen handeln kann. Dann sehen wir auch, dass der Parameter von @Retention vom Typ RetentionPolicy.RUNTIME ist, was angibt, dass die Annotation bis zur Laufzeit beibehalten wird. Die
-Annotation wird mit @Interface deklariert, was einer Schnittstelle ähnelt. Auf @Interface folgt der Name der Annotation. Der Name dieser Annotation ist CETypeAnnotation. Es gibt eine öffentliche Ganzzahl (int) Typ-IDAttribut. Der Standardwert dieses Attributs ist 0, wie unten gezeigt.
2. Verwendung von Anmerkungen
Der folgende Codeausschnitt ist die Verwendung der obigen Anmerkungen. Da die oben erstellte Annotation vom Typ ElementType.TYPE ist, verwenden wir diese Annotation, um eine von uns erstellte Klasse zu ändern, bei der es sich um die TestClass unten handelt. Beim Annotieren von Änderungen legen wir einen Wert für id fest, der unten id = 10 lautet.
3. Verwenden Sie Reflektion, um Informationen über geänderte Typanmerkungen zu erhalten
Als Nächstes fügen wir den „Reflexionsmechanismus“ von Java zur Klasse AnnotationTracker hinzu, um die annotationsbezogenen Informationen der entsprechenden TestClass-Klasse zu erhalten. Der Schlüsselcode lautet wie folgt. Der Parameter der Methode trackTypeAnnotation() ist ein Klassentyp, und dann kann das Annotationsobjekt in der entsprechenden Klasse über die Methode getAnnotation() der Klasse abgerufen werden. Wie im roten Feld unten gezeigt.
Nachdem wir das entsprechende Annotationsobjekt erhalten haben, können wir die Konfigurationsinformationen in der entsprechenden Annotation abrufen.
4. Testfälle und Testergebnisse
Als nächstes werden wir in Rufen Sie in der Main-Methode die obige Methode in der AnnotationTracker-Klasse auf und übergeben Sie TestClass, wie unten gezeigt. Nachfolgend finden Sie einen Ausdruck davon.
4. Andere Arten von Anmerkungen
Wir haben die Annotationen vom Typ ElementType.TYPE oben ausführlich besprochen. Als nächstes werfen wir einen Blick auf andere Annotationstypen und wie man diese Annotationen verwendet.
1. @Target(ElementType.CONSTRUCTOR)
Als nächstes erstellen wir eine Annotation, die den Konstruktor schmückt. Die CEConstructorAnnotation unten ist die Annotation, die wir erstellt haben, um den Klassenkonstruktor zu ändern. Der Standardwert des Wertfelds ist eine leere -Zeichenfolge .
2. @Target(ElementType.FIELD)
Als nächstes erstellen wir eine Anmerkung, die das Feld ändert. Wir nennen das Feld CEFieldAnnotation. Der spezifische Code lautet wie folgt:
3. @Target(ElementType.METHOD)
Unten finden Sie die Anmerkung der von uns erstellten Änderungsmethode. Wir haben sie CEMethodAnnotation genannt.
4. @Target(ElementType.PARAMETER)
Nachfolgend finden Sie die Anmerkungen zu den Parametern in der modifizierten Methode. Wir benennen sie wie folgt:
5. Verwendung der oben genannten verwandten Anmerkungen
Im Folgenden wird beschrieben, wie die verschiedenen oben definierten Arten von Anmerkungen verwendet werden, wobei jede ihre eigene Funktion hat eigene Pflichten. Ich werde nicht zu sehr ins Detail gehen.
6. Verwenden Sie den Reflexionsmechanismus, um verschiedene Arten von Anmerkungsinformationen zu erhalten
Zuvor haben wir darüber gesprochen, wie der Reflexionsmechanismus von „Java“ verwendet werden kann, um relevante Anmerkungsinformationen zu erhalten. Nachfolgend erhalten wir die relevanten Informationen zu den verschiedenen oben genannten Arten von Anmerkungen. Der folgende Code ist hauptsächlich der relevante Code in AnnotationTracker.
1. Rufen Sie die Anmerkungsinformationen des geänderten Konstruktortyps ab
2. Anmerkungsinformationen zu geänderten Methoden und Methodenparametern abrufen
3. Holen Sie sich die Anmerkungsinformationen des geänderten Feldes
4 und Ausgabeergebnis
Das obige ist der detaillierte Inhalt vonAnmerkungen in Java Reflection. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!