Wie und wo werden Anmerkungen in Java verwendet?

218

Was sind die Hauptbereiche, in denen wir Anmerkungen verwenden können? Ist die Funktion ein Ersatz für eine XML-basierte Konfiguration?

Biju CD
quelle
2
cdb, ich bin mir nicht sicher, ob Sie wirklich auf die Idee von Kopfgeldern kommen - Sie haben hier eine Reihe ziemlich guter Antworten, und ohne zu klären, was in ihnen fehlt oder wonach Sie speziell suchen, haben Sie ein Kopfgeld hinzugefügt. (Sie haben dies auch hier getan : stackoverflow.com/questions/1746550/… )
delfuego
5
Okay, ich weiß, dass dies super alt ist, aber @delfuego: Wenn Sie dem OP mitteilen, dass er Kopfgelder falsch verwendet, kann es hilfreich sein, nachzufolgen, indem Sie auch erklären, wie man sie richtig verwendet .
Pops

Antworten:

308

Anmerkungen sind Meta-Meta-Objekte, mit denen andere Meta-Objekte beschrieben werden können . Metaobjekte sind Klassen, Felder und Methoden. Das Abfragen eines Objekts nach seinem Metaobjekt (z. B. anObj.getClass()) wird Introspektion genannt . Die Selbstbeobachtung kann weiter gehen und wir können ein Metaobjekt fragen, was seine Anmerkungen sind (z aClass.getAnnotations. B. ). Selbstbeobachtung und Anmerkungen gehören zu dem, was als Reflexion und Metaprogrammierung bezeichnet wird .

Eine Anmerkung muss auf die eine oder andere Weise interpretiert werden, um nützlich zu sein. Anmerkungen können zur Entwicklungszeit von der IDE oder dem Compiler oder zur Laufzeit von einem Framework interpretiert werden .

Die Verarbeitung von Anmerkungen ist ein sehr leistungsfähiger Mechanismus und kann auf viele verschiedene Arten verwendet werden:

  • um Einschränkungen oder die Verwendung eines Elements zu beschreiben: z. B. @Deprecated, @Overrideoder@NotNull
  • um die "Natur" eines Elements zu beschreiben, z @Entity, @TestCase, @WebService
  • um das Verhalten eines Elements zu beschreiben: @Statefull, @Transaction
  • um zu beschreiben, wie das Element verarbeitet wird: @Column, @XmlElement

In allen Fällen wird eine Anmerkung verwendet, um das Element zu beschreiben und seine Bedeutung zu verdeutlichen .

Vor JDK5 mussten Informationen, die jetzt mit Anmerkungen ausgedrückt werden, an einem anderen Ort gespeichert werden, und häufig wurden XML-Dateien verwendet. Es ist jedoch bequemer, Anmerkungen zu verwenden, da sie zum Java-Code selbst gehören und daher viel einfacher zu bearbeiten sind als XML.

Verwendung von Anmerkungen:

  • Dokumentation, zB XDoclet
  • Zusammenstellung
  • IDE
  • Test-Framework, zB JUnit
  • IoC-Container zB als Spring
  • Serialisierung, zB XML
  • Aspektorientierte Programmierung (AOP), zB Spring AOP
  • Anwendungsserver, z. B. EJB-Container, Webdienst
  • Object-Relational Mapping (ORM), z. B. Hibernate, JPA
  • und viele mehr...

... schauen Sie sich zum Beispiel das Projekt Lombok an , das mithilfe von Anmerkungen definiert, wie equalsoder hashCodeMethoden generiert werden sollen.

ewernli
quelle
50

Es gibt mehrere Anwendungen für Java-Anmerkungen. Erstens können sie vom Compiler (oder von Compiler-Erweiterungen) verwendet werden. Betrachten Sie zum Beispiel die Annotation Override :

class Foo {

    @Override public boolean equals(Object other) {
        return ...;
    }
}

Dieser ist tatsächlich in das Java JDK integriert. Der Compiler signalisiert einen Fehler, wenn eine Methode damit markiert ist, die eine von einer Basisklasse geerbte Methode nicht überschreibt. Diese Anmerkung kann hilfreich sein, um den häufigen Fehler zu vermeiden, bei dem Sie tatsächlich beabsichtigen, eine Methode zu überschreiben, dies jedoch nicht tun, da die in Ihrer Methode angegebene Signatur nicht mit der Signatur der überschriebenen Methode übereinstimmt:

class Foo {

    @Override public boolean equals(Foo other) {  // Compiler signals an error for this one
        return ...;
    }
}

Ab JDK7 sind Anmerkungen für jeden Typ zulässig. Diese Funktion kann jetzt für Compiler-Annotationen wie NotNull verwendet werden , wie in:

public void processSomething(@NotNull String text) {
    ...
}

Dadurch kann der Compiler Sie vor unsachgemäßer / ungeprüfter Verwendung von Variablen und Nullwerten warnen .

Eine weitere erweiterte Anwendung für Anmerkungen umfasst die Reflexion und die Verarbeitung von Anmerkungen zur Laufzeit. Dies ist (glaube ich) das, was Sie im Sinn hatten, als Sie von Anmerkungen als "Ersatz für XML-basierte Konfiguration" sprachen. Dies ist die Art der Annotationsverarbeitung, die beispielsweise von verschiedenen Frameworks und JCP-Standards (Persistenz, Abhängigkeitsinjektion, wie Sie es nennen) verwendet wird, um die erforderlichen Metadaten und Konfigurationsinformationen bereitzustellen.

Dolch
quelle
18

Anmerkungen sind eine Form von Metadaten (Daten zu Daten), die einer Java-Quelldatei hinzugefügt werden. Sie werden hauptsächlich von Frameworks verwendet, um die Integration von Client-Code zu vereinfachen. Ein paar Beispiele aus der Praxis:

  • JUnit 4 - Sie fügen die @TestAnnotation zu jeder Testmethode hinzu, die der JUnit-Runner ausführen soll. Es gibt auch zusätzliche Anmerkungen zum Einrichten von Tests (wie @Beforeund @BeforeClass). All dies wird vom JUnit-Läufer verarbeitet, der die Tests entsprechend ausführt. Man könnte sagen, es ist ein Ersatz für die XML-Konfiguration, aber Anmerkungen sind manchmal leistungsfähiger (sie können beispielsweise Reflektion verwenden) und sie befinden sich auch näher an dem Code, auf den sie verweisen (die @TestAnmerkung befindet sich direkt vor der Testmethode, also dem Zweck von dieser Methode ist klar - dient auch als Dokumentation). Die XML-Konfiguration kann andererseits komplexer sein und viel mehr Daten enthalten als Anmerkungen.

  • Terrakotta - verwendet sowohl Anmerkungen als auch XML-Konfigurationsdateien. Beispielsweise @Rootteilt die Annotation der Terracotta-Laufzeit mit, dass das annotierte Feld ein Stamm ist und sein Speicher von VM-Instanzen gemeinsam genutzt werden sollte. Die XML-Konfigurationsdatei wird verwendet, um den Server zu konfigurieren und ihm mitzuteilen, welche Klassen instrumentiert werden sollen.

  • Google Guice - Ein Beispiel wäre die @InjectAnnotation, bei der die Guice-Laufzeit bei Anwendung auf einen Konstruktor anhand der definierten Injektoren nach Werten für jeden Parameter sucht. Die @InjectAnnotation ist mit XML-Konfigurationsdateien nur schwer zu replizieren, und ihre Nähe zum Konstruktor, auf den sie verweist, ist sehr nützlich (stellen Sie sich vor, Sie müssen in einer großen XML-Datei suchen, um alle von Ihnen eingerichteten Abhängigkeitsinjektionen zu finden).

Hoffentlich habe ich Ihnen einen Eindruck davon gegeben, wie Anmerkungen in verschiedenen Frameworks verwendet werden.

Flaviu Cipcigan
quelle
12

Anmerkungen in Java bieten ein Mittel zur Beschreibung von Klassen, Feldern und Methoden. Im Wesentlichen handelt es sich um eine Form von Metadaten, die einer Java-Quelldatei hinzugefügt werden. Sie können die Semantik eines Programms nicht direkt beeinflussen. Anmerkungen können jedoch zur Laufzeit mit Reflection gelesen werden. Dieser Vorgang wird als Introspection bezeichnet. Dann könnte es verwendet werden, um Klassen, Felder oder Methoden zu ändern.

Diese Funktion wird häufig von Bibliotheken und SDKs (Ruhezustand, JUnit, Spring Framework) ausgenutzt, um die Codemenge zu vereinfachen oder zu reduzieren, die ein Programmierer ausführen würde, wenn er nicht mit diesen Bibliotheken oder SDKs arbeiten würde Reflexionsarbeit Hand in Hand in Java.

Wir können auch die Verfügbarkeit einer Anmerkung auf Kompilierungszeit oder Laufzeit beschränken. Nachfolgend finden Sie ein einfaches Beispiel zum Erstellen einer benutzerdefinierten Anmerkung

Driver.java

package io.hamzeen;

import java.lang.annotation.Annotation;

public class Driver {

    public static void main(String[] args) {
        Class<TestAlpha> obj = TestAlpha.class;
        if (obj.isAnnotationPresent(IssueInfo.class)) {

            Annotation annotation = obj.getAnnotation(IssueInfo.class);
            IssueInfo testerInfo = (IssueInfo) annotation;

            System.out.printf("%nType: %s", testerInfo.type());
            System.out.printf("%nReporter: %s", testerInfo.reporter());
            System.out.printf("%nCreated On: %s%n%n",
                    testerInfo.created());
        }
    }
}

TestAlpha.java

package io.hamzeen;

import io.hamzeen.IssueInfo;
import io.hamzeen.IssueInfo.Type;

@IssueInfo(type = Type.IMPROVEMENT, reporter = "Hamzeen. H.")
public class TestAlpha {

}

IssueInfo.java

package io.hamzeen;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author Hamzeen. H.
 * @created 10/01/2015
 * 
 * IssueInfo annotation definition
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface IssueInfo {

    public enum Type {
        BUG, IMPROVEMENT, FEATURE
    }

    Type type() default Type.BUG;

    String reporter() default "Vimesh";

    String created() default "10/01/2015";
}
Hamzeen Hameem
quelle
6

Ist es ein Ersatz für eine XML-basierte Konfiguration?

Nicht vollständig, aber eine Konfiguration, die eng mit Codestrukturen übereinstimmt (z. B. JPA-Zuordnungen oder Abhängigkeitsinjektion im Frühjahr), kann häufig durch Anmerkungen ersetzt werden und ist dann in der Regel weniger ausführlich, nervig und schmerzhaft. Nahezu alle bemerkenswerten Frameworks haben diesen Wechsel vorgenommen, obwohl die alte XML-Konfiguration normalerweise als Option verbleibt.

Michael Borgwardt
quelle
Angeblich können durch Anmerkungen die XML-Datei für die Gesichtskonfiguration für JSF vollständig entfernt werden. Ich bin auf diesen Beitrag gestoßen, als ich versucht habe herauszufinden, wie das geht ...
Brian Knoblauch
6

Es gibt 2 Ansichten von Anmerkungen

  1. In der Benutzeransicht funktionieren Anmerkungen meistens wie eine Verknüpfung, speichern einige Tastenanschläge oder machen Ihr Programm besser lesbar

  2. Herstelleransicht, die Ansicht des Prozessors zur Annotation ist eher eine leichtgewichtige "Schnittstelle", Ihr Programm konfrontiert ETWAS, ohne jedoch die bestimmte Schnittstelle explizit "zu implementieren" (hier auch als Annotation bezeichnet).

zB in jpa definieren Sie so etwas wie

@Entity class Foo {...}

anstatt

class Foo implements Entity {...}

beide sprechen dasselbe "Foo ist eine Entitätsklasse"

Dapeng
quelle
3

Wo Anmerkungen verwendet werden können

Anmerkungen können auf Deklarationen angewendet werden: Deklarationen von Klassen, Feldern, Methoden und anderen Programmelementen. Bei Verwendung in einer Deklaration wird jede Anmerkung häufig gemäß Konvention in einer eigenen Zeile angezeigt.

Java SE 8 Update: Anmerkungen können auch auf die Verwendung von Typen angewendet werden. Hier sind einige Beispiele:

  • Ausdruck für die Erstellung von Klasseninstanzen:

    neues @Interned MyObject ();

  • Typ gegossen:

    myString = (@NonNull String) str;

  • implementiert Klausel:

    Klasse UnmodizableList implementiert @Readonly List <@Readonly T> {...}

  • Ausgelöste Ausnahmeerklärung:

    void monitorTemperature () löst @Critical TemperatureException aus {...}

Premraj
quelle
2

Frameworks wie Hibernate, in denen viele Konfigurationen / Zuordnungen erforderlich sind, verwenden Anmerkungen stark.

Schauen Sie sich die Anmerkungen zum Ruhezustand an

medopal
quelle
1
Während dies theoretisch die Frage beantworten kann, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
Rohit Gupta
2

JPA (aus Java EE 5) ist ein hervorragendes Beispiel für die (Über-) Verwendung von Anmerkungen. Java EE 6 wird auch Annotationen in vielen neuen Bereichen einführen, wie z. B. RESTful-Webservices und neue Annotationen für jede der guten alten Servlet-APIs.

Hier sind mehrere Ressourcen:

Es sind nicht nur die Konfigurationsspezifikationen, die durch Anmerkungen übernommen werden sollen, sondern sie können auch zur Steuerung des Verhaltens verwendet werden. Sie sehen dies bereits in den JAX-RS-Beispielen des Java EE 6.

BalusC
quelle
1

Es ist nützlich, um Ihre Klassen entweder auf Methoden-, Klassen- oder Feldebene mit Anmerkungen zu versehen, etwas an dieser Klasse, das nicht ganz mit der Klasse zusammenhängt.

Sie können eigene Anmerkungen haben, mit denen bestimmte Klassen nur als Test verwendet werden. Es kann einfach zu Dokumentationszwecken dienen oder Sie können es erzwingen, indem Sie es während der Kompilierung eines Produktionsversionskandidaten herausfiltern.

Sie können Anmerkungen verwenden, um einige Metadaten zu speichern, z. B. in einem Plugin-Framework, z. B. den Namen des Plugins.

Es ist nur ein weiteres Werkzeug, es hat viele Zwecke.

Chii
quelle
1

Es fügt zusätzliche Informationen über Code durch (a) Compilerprüfung oder (b) Codeanalyse hinzu

** **.

  • Im Folgenden sind die integrierten Annotations :: 2-Typen aufgeführt

** **.

Typ 1) Anmerkungen zum Java-Code:

@Override // gives error if signature is wrong while overriding.
Public boolean equals (Object Obj) 

@Deprecated // indicates the deprecated method
Public doSomething()....

@SuppressWarnings() // stops the warnings from printing while compiling.
SuppressWarnings({"unchecked","fallthrough"})

Typ 2) Anmerkungen, die auf andere Anmerkungen angewendet werden:

@Retention - Specifies how the marked annotation is storedWhether in code only, compiled into the class, or available at run-time through reflection.

@Documented - Marks another annotation for inclusion in the documentation.

@Target - Marks another annotation to restrict what kind of java elements the annotation may be applied to

@Inherited - Marks another annotation to be inherited to subclasses of annotated class (by default annotations are not inherited to subclasses).

** **.

  • Benutzerdefinierte Anmerkungen ::

** http://en.wikipedia.org/wiki/Java_annotation#Custom_annotations


Um besser zu verstehen, versuchen Sie es unter dem Link: Arbeiten Sie mit Beispielen


http://www.javabeat.net/2007/08/annotations-in-java-5-0/

krishna_kp
quelle
0

Anmerkungen können als Alternative zu externen Konfigurationsdateien verwendet werden, können jedoch nicht als vollständiger Ersatz angesehen werden. Es gibt viele Beispiele, in denen Annotationi zum Ersetzen von Konfigurationsdateien verwendet wurde, z. B. Hibernate, JPA, EJB 3 und fast alle in Java EE enthaltenen Technologien.

Auf jeden Fall ist dies nicht immer eine gute Wahl. Der Zweck der Verwendung von Konfigurationsdateien besteht normalerweise darin, den Code von den Details der Umgebung zu trennen, in der die Anwendung ausgeführt wird. In solchen Situationen und meistens, wenn die Konfiguration verwendet wird, um die Anwendung der Struktur eines externen Systems zuzuordnen, sind Anmerkungen kein guter Ersatz für die Konfigurationsdatei, da Sie die Details des externen Systems in den Quellcode von aufnehmen können Ihre Bewerbung. Hier sind externe Dateien als die beste Wahl anzusehen, andernfalls müssen Sie den Quellcode ändern und jedes Mal neu kompilieren, wenn Sie ein relevantes Detail in der Ausführungsumgebung ändern.

Anmerkungen eignen sich viel besser, um den Quellcode mit zusätzlichen Informationen zu dekorieren, die Verarbeitungswerkzeuge sowohl zur Kompilierungszeit als auch zur Laufzeit anweisen, Klassen und Klassenstrukturen auf besondere Weise zu behandeln. @Overrideund JUnits @Testsind gute Beispiele für eine solche Verwendung, die bereits in anderen Antworten ausführlich erläutert wurden.

Am Ende ist die Regel immer dieselbe: Behalten Sie die Dinge, die sich mit der Quelle ändern, in der Quelle und die Dinge, die sich unabhängig von der Quelle ändern, außerhalb der Quelle.

Massimiliano Fliri
quelle
0

Java EE 5 bevorzugt die Verwendung von Anmerkungen gegenüber der XML-Konfiguration. In EJB3 werden beispielsweise die Transaktionsattribute einer EJB-Methode mithilfe von Anmerkungen angegeben. Sie verwenden sogar Anmerkungen, um POJOs als EJBs zu markieren und bestimmte Methoden als Lebenszyklusmethoden anzugeben, anstatt die Implementierung einer Schnittstelle zu erfordern.

Ken Liu
quelle
0

Der Zweck einer Java-Annotation besteht einfach darin, dem annotierten Programmelement Informationen zuzuordnen. Java-Annotationen können als Modifikatoren in jeder Deklaration verwendet werden, unabhängig davon, ob Paket, Klasse (einschließlich Aufzählungen), Schnittstelle (einschließlich Annotationstypen), Feld, Methode, formaler Parameter, Konstruktor oder lokale Variable.

Java-Annotationen können auch für Enum-Konstanten verwendet werden. Solche Annotationen werden unmittelbar vor der Enum-Konstante platziert, die sie annotieren. Java-Annotationen werden herkömmlicherweise vor allen anderen Modifikatoren platziert, dies ist jedoch keine Voraussetzung. Sie können frei mit anderen Modifikatoren gemischt werden.

Lesen Sie ausführlich über Java-Anmerkungen .

Krishan
quelle
0

Im Folgenden finden Sie einige Stellen, an denen Sie Anmerkungen verwenden können.

a. Annotations can be used by compiler to detect errors and suppress warnings
b. Software tools can use annotations to generate code, xml files, documentation etc., For example, Javadoc use annotations while generating java documentation for your class.
c. Runtime processing of the application can be possible via annotations.
d. You can use annotations to describe the constraints (Ex: @Null, @NotNull, @Max, @Min, @Email).
e. Annotations can be used to describe type of an element. Ex: @Entity, @Repository, @Service, @Controller, @RestController, @Resource etc.,
f. Annotation can be used to specify the behaviour. Ex: @Transactional, @Stateful
g. Annotation are used to specify how to process an element. Ex: @Column, @Embeddable, @EmbeddedId
h. Test frameworks like junit and testing use annotations to define test cases (@Test), define test suites (@Suite) etc.,
i. AOP (Aspect Oriented programming) use annotations (@Before, @After, @Around etc.,)
j. ORM tools like Hibernate, Eclipselink use annotations

Unter diesem Link finden Sie weitere Informationen zu Anmerkungen.

Über diesen Link können Sie sehen, wie Anmerkungen zum Erstellen einer einfachen Testsuite verwendet werden.

Hari Krishna
quelle