Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo ich habe eine Verständnisfrage zu Annotations.
Ich habe hier so Annotation wie: @Named
@Stateless
@Dependent
@Transactional(Transactional.TxType.MANDATORY)
@ApplicationScoped
Was genau sind Annotationen ? Also ich verstehe wohl das jedes von denen irgendwas tut aber wie genau funktioniert das? Wenn ich z.B. in ein Interface @Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface testInterface{ }
schreibe und es in ner Klasse mit @testInterface
aufrufe was genau passiert da? Das verstehe ich nicht so ganz. Ich glaube ich verstehe die ganzen Annotationen nicht
Hat da vllt wer ne erklärung wie das alles funktioniert?
Eine Annotation macht erstmal nichts, die bewirken erst etwas, wenn sie von irgendwem ausgewertet werden, die Annotation von open zB vom JavaEE-Container.
Das ist vergleichbar mit Notizen, die du dir bei irgendetwas notierst. Das Notieren bewirkt nichts, erst der Leser kann damit irgendwas anfangen.
Bevor du dich an JavaEE machst, solltest du dich noch mal mit den Grundlagen der Sprache auseinander setzen
Eigentlich ist das alles in dem Link von @thecain genau beschrieben. Eine Annotation ist zunächst einmal nichts anderes als eine strukturierte Zusatzinformation zum Code, macht also selbst gar nichts (s. Kommentar von @mrBrown).
Eine Annotation unterscheidet sich von einem Kommentar insbesondere darin, dass die Annotation zur Übersetzungs- und Laufzeit verarbeitet werden kann. In diesem kleinen Detail stecken die ganzen Möglichkeiten, die sich mit Annotationen ergeben.
Mal ein kleines Beispiel:
Java:
public class Zahl {
int wert;
/* überschreibt Object#equals() */
public boolean equals(Zahl zahl) {
return wert == zahl.wert;
}
...
Das sieht auf den ersten Blick passend aus, ist aber falsch. Die Methode hat eine andere Signatur, überschreibt somit Object#equals() nicht - obwohl der Kommentar etwas anderes behauptet. Wenn man nicht aufpasst, bekommt man das erstmal nicht mit und wundert sich, warum das Programm nicht richtig funktioniert.
Eine von Java mitgelieferte Annotation schafft hier Abhilfe:
Java:
public class Zahl {
int wert;
@Overrides
public boolean equals(Zahl zahl) {
return wert == zahl.wert;
}
...
Die Aussage ist nun die gleiche wie im Kommentar, allerdings wird sie jetzt vom Compiler geprüft und mit einem Fehler quittiert.
Das war jetzt nur eine kleine Prüfung durch den Compiler. Der Spaß geht aber sehr viel weiter. So können zur Übersetzungszeit Annotationen ausgewertet werden, um Code noch vor dem Kompilieren zu erzeugen.
public class Zahl {
int wert;
public int getWert() {
return wert;
}
}
einfach
Java:
public class Zahl {
@Getter int wert;
}
schreiben (Lombok erzeugt dann automatisch den Code für die Methode getWert()).
Viele Annotationen werden erst zur Laufzeit ausgewertet. Beispielsweise definiert die Bean Validation API Annotationen zur Beschreibung von zulässigen Feldinhalten:
Java:
public class Person {
@NotBlank
private String name;
@Email
private String email;
...
}
Wird ein Person-Objekt zur Laufzeit über einen entsprechenden Aufruf validiert, wird geprüft, dass das Feld name nicht null ist und nicht ausschließlich aus Whitespaces besteht. Außerdem wird sichergestellt, dass das email-Feld eine gültige E-Mail-Adresse enthält.
Das ist nur die Spitze des Eisbergs - es gibt zig Anwendungen für Annotationen.