Java-Anmerkungen

114

Was ist der Zweck von Anmerkungen in Java? Ich habe diese unscharfe Vorstellung von ihnen als irgendwo zwischen einem Kommentar und dem tatsächlichen Code. Beeinflussen sie das Programm zur Laufzeit?

Was sind ihre typischen Verwendungen?

Sind sie einzigartig in Java? Gibt es ein C ++ - Äquivalent?

Lehane
quelle
9
Sie können einige wirklich böse Dinge mit Anmerkungen tun. Wenn Sie beispielsweise Spring Framework und dessen @ Transactional-Annotation kennen, die eine Transaktion vor dem Methodenaufruf und Rollbacks bei Ausnahme / Fehler startet und bei erfolgreicher Transaktion festschreibt. Es unterstützt voll und ganz das SOC-Prinzip (Trennung von Bedenken). Sehr sauber ! Java-Regeln! :-)
1
Das sieht für mich nach 3 Fragen aus. Der zweite an sich ist zu breit.
Raedwald
Alle Anmerkungen nach Syntax sehen aus wie Schnittstellen. Woher kennt der Compiler oder die JVM ihren Zweck? Angenommen, wir nehmen @ Override -> und prüfen, ob die Methode ordnungsgemäß überschrieben wurde oder nicht. @ Transactional führt, wie oben erläutert, transaktionsbezogene Dinge aus. Wo finden wir bei all diesen Anmerkungen Definition / Logik?
Paramesh Korrakuti

Antworten:

80

Anmerkungen werden hauptsächlich von Code verwendet, der anderen Code überprüft. Sie werden häufig verwendet, um vorhandene Klassen zur Laufzeit zu ändern (dh zu dekorieren oder zu verpacken), um ihr Verhalten zu ändern. Frameworks wie JUnit und Hibernate verwenden Anmerkungen, um die Menge an Code zu minimieren, die Sie selbst schreiben müssen, um die Frameworks zu verwenden.

Oracle hat auf seiner Website eine gute Erklärung des Konzepts und seiner Bedeutung in Java .

Anders Sandvig
quelle
17

Sind sie auch nur in Java verfügbar? Gibt es ein C ++ - Äquivalent?

Nein, aber VB und C # haben Attribute , die dasselbe sind.

Ihre Verwendung ist sehr vielfältig. Ein typisches Java-Beispiel @Overridehat keine Auswirkungen auf den Code, kann jedoch vom Compiler verwendet werden, um eine Warnung (oder einen Fehler) zu generieren, wenn die dekorierte Methode eine andere Methode nicht überschreibt. Ebenso können Methoden als veraltet markiert werden.

Dann gibt es Reflexion. Wenn Sie einen Klassentyp in Ihrem Code widerspiegeln, können Sie auf die Attribute zugreifen und gemäß den dort enthaltenen Informationen handeln. Ich kenne keine Beispiele in Java, aber in .NET wird dies vom Compiler verwendet, um (De-) Serialisierungsinformationen für Klassen zu generieren , das Speicherlayout von Strukturen zu bestimmen und Funktionsimporte aus Legacy-Bibliotheken (unter anderem) zu deklarieren . Sie steuern auch, wie der IDE-Formular-Designer funktioniert.

/ EDIT: Attribute für Klassen sind vergleichbar mit Tag-Schnittstellen (wie Serializable in Java). In den .NET-Codierungsrichtlinien wird jedoch festgelegt, keine Tag-Schnittstellen zu verwenden. Außerdem arbeiten sie nur auf Klassenebene, nicht auf Methodenebene.

Konrad Rudolph
quelle
13

Anders gibt eine gute Zusammenfassung und hier ist ein Beispiel für eine JUnit-Annotation

@Test(expected=IOException.class)
public void flatfileMissing() throws IOException {
    readFlatFile("testfiles"+separator+"flatfile_doesnotexist.dat");
}

Hier @Testsagt die Annotation JUnit, dass die flatfileMissingMethode ein Test ist, der ausgeführt werden sollte, und dass das erwartete Ergebnis ein Wurf ist IOException. Wenn Sie also Ihre Tests ausführen, wird diese Methode aufgerufen und der Test wird bestanden oder fehlgeschlagen, je nachdem, ob ein Test IOExceptionausgelöst wird.

Eli Courtwright
quelle
7

Java verfügt auch über das Annotation Processing Tool (apt), mit dem Sie nicht nur Annotationen erstellen, sondern auch entscheiden, wie diese Annotationen im Quellcode funktionieren.

Hier ist eine Einführung.

pek
quelle
4

Schauen Sie sich meine JavaBean-Annotationen und den Annotation-Prozessor an , um einige coole Dinge zu sehen, die Sie mit Annotations machen können .

Sie eignen sich hervorragend zum Generieren von Code und zum Hinzufügen zusätzlicher Validierungen während Ihres Builds. Ich habe sie auch für ein Fehlermeldungs-Framework verwendet (noch nicht veröffentlicht - muss mit den Vorgesetzten geklärt werden ...).

Scott Stanchfield
quelle
1

Per Literaldefinition fügt eine Anmerkung einem Element Notizen hinzu. Ebenso sind Java-Annotationen Tags, die wir in den Quellcode einfügen, um weitere Informationen zum Code bereitzustellen. Java-Annotationen verknüpfen Informationen mit dem annotierten Programmelement. Neben Java-Anmerkungen verfügen Java-Programme über zahlreiche informelle Dokumentationen, die normalerweise in Kommentaren in der Quellcodedatei enthalten sind. Java-Annotationen unterscheiden sich jedoch von Kommentaren, mit denen die Programmelemente direkt mit Annotationstypen versehen werden, um die Form der Annotationen zu beschreiben. Java Annotations präsentieren die Informationen auf standardmäßige und strukturierte Weise, sodass sie von Verarbeitungswerkzeugen problemlos verwendet werden können.

Um im Detail zu lesen, gibt es ein schönes Tutorial zu Java Annotations

Krishan
quelle
0

Anmerkungen in Bezug auf EJB werden als impliziter Middleware-Ansatz gegenüber einem expliziten Middleware-Ansatz bezeichnet. Wenn Sie Anmerkungen verwenden, passen Sie an, was Sie genau über die API benötigen, z. B. müssen Sie die Transaktionsmethode für eine Überweisung aufrufen : ohne Verwendung von Annotation: Der Code wird sein

transfer(Account account1, Account account2, long amount)    
{
   // 1: Call middleware API to perform a security check
   // 2: Call middleware API to start a transaction
   // 3: Call middleware API to load rows from the database
   // 4: Subtract the balance from one account, add to the other
   // 5: Call middleware API to store rows in the database
   // 6: Call middleware API to end the transaction
}

Während der Verwendung von Annotation enthält Ihr Code keine umständlichen API-Aufrufe zur Verwendung der Middleware-Dienste. Der Code ist sauber und auf Geschäftslogik ausgerichtet

transfer(Account account1, Account account2, long amount) 
{
   // 1: Subtract the balance from one account, add to the other
}
Mähdrescher
quelle