Annotation in Java 1.5

Ähnliche Dokumente
OOP. Tagesprogramm. Aspektorientierte Programmierung. Annotationen

Aspektorientierte Programmierung

Literatur. Komponenten WS 2014/15 Teil 9/Annotations

Komponenten-basierte Entwicklung. Teil 9: Annotations

Meta Programming and Reflection in Java

Neuere Sprachelemente in Java

Java Reflection. Andreas Lochbihler. 15. Mai Lehrstuhl Programmierparadigmen Universität Karlsruhe

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Annotationen in Java. Vereinbarung von Annotationen. Andreas Solymosi

Algorithmen und Datenstrukturen

Properties und Proxies

Spracherweiterungen in Java 5

Allgemeine Hinweise:

1 Einleitung Generizität Syntax... 2

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

Programmieren I. Dokumentation mit javadoc Heusch 10.4 Ratz Institut für Angewandte Informatik

Aufgabenblatt 4. Aufgabe 3. Aufgabe 1. Aufgabe 2. Prof. Dr. Th. Letschert Algorithmen und Datenstrukturen

Informatik II Übung 6

12 Abstrakte Klassen, finale Klassen und Interfaces

IT I: Heute. Nachbetrachtung Wissensüberprüfung. Einführung Vererbung. Roboter in becker.robots. Filialenbelieferung 4.11.

9. Ausnahmebehandlung

IT I: Heute. abstrakte Methoden und Klassen. Interfaces. Interfaces List, Set und Collection IT I - VO 7 1

Vorkurs Informatik WiSe 15/16

Algorithmen und Datenstrukturen 07

IT I: Heute. Nachbetrachtung Wissensüberprüfungen. Einführung Vererbung. Roboter in becker.robots. falls Zeit: Scheduling 8.11.

Systematisches Testen

Grundlagen zu Assertions

Einstieg in die Informatik mit Java

Programmieren in Java

3. Übungsbesprechung Programmkonstruktion

Java I Vorlesung Generics und Packages

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Informatik II - Tutorium 6

Das Interface-Konzept am Beispiel der Sprache Java

Programmieren in Java

Info B VL 14: Java Collections/Reflections

Interface. So werden Interfaces gemacht

Universität Karlsruhe (TH)

Programmieren in Java -Eingangstest-

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Interfaces und Vererbung

Einführung in Javadoc

Enum Aufzählungstypen in Java

Einstieg in die Informatik mit Java

Java-Schulung Grundlagen

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Vererbung Was versteht man unter dem Begriff Vererbung?

Prof. W. Henrich Seite 1

8. Generics Grundlagen der Programmierung 1 (Java)

Heute. Nachbetrachtung Wissensüberprüfung. Sortieren Interface Comparable TreeSet Sortieren von Arrays: Arrays.sort() 3.12.

JAVA 05: Objektorientierte Konzepte

Umgang mit Fehlern. Sinn von Ausnahme-/Fehlerobjekten Dokumentation Umgang mit Fehlern Eigene Fehlerklassen

Einstieg in die Informatik mit Java

Institut für Programmierung und Reaktive Systeme. Java 2. Markus Reschke

Vererbung. Was versteht man unter dem Begriff Vererbung?

Ausnahmen (Exceptions)

Objektorientierte Programmierung Studiengang Medieninformatik

Praxis der Programmierung

Objektorientierung (OO)

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Programmierung Nachklausurtutorium

14 Abstrakte Klassen, finale Klassen, Interfaces

Faulheit professionell: Fertige Datenbehälter. Das Java-Collections-Framework Typsicherheit Generische Klassen

JAVA Kommentieren mit Javadoc

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

2 Eine einfache Programmiersprache

14 Abstrakte Klassen, finale Klassen, Interfaces

Java Einführung Klassendefinitionen

hue13 January 30, 2017

Stack stack = new Stack(); stack.push ("Würstchen"); string s = (string) stack.pop(); Console.WriteLine (s);

OOP. Tagesprogramm. Aspekte und Annotationen. Software-Entwurfsmuster. Factory-Method. Prototype

Kapitel 5: Interfaces

Programmieren I. Fehlerbehandlung Exceptions. Heusch 2. Bd, 3 Ratz 10. Institut für Angewandte Informatik

Java Tools JDK. IDEs. Downloads. Eclipse. IntelliJ. NetBeans. Java SE 8 Java SE 8 Documentation

Vorkurs Informatik WiSe 17/18

Vorkurs Informatik WiSe 16/17

Info B VL 11: Innere Klassen/Collections

Programmieren in C++ Templates

Objektorientierung III

Listing 1: Cowboy. Listing 2: Woody

Programmieren in Java

Java Reflection. Meta-Programmierung mit der java.lang.reflection API. Prof. Dr. Nikolaus Wulff

Prüfung Softwareentwicklung II (IB)

Abschnitt 10: Typisierte Klassen

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Komponenten & Frameworks Seite 1

Kurzanleitung RMI-Beispiel: gettime Seite 1 / 7. RMI Projekt gettime 1

II.4.4 Exceptions - 1 -

Probeklausur Java Einführung in die Informatik. Wintersemester 2016/2017

Teil 5 - Java. Programmstruktur Operatoren Schlüsselwörter Datentypen

9. Ausnahmebehandlung

4. Vererbung Die Klasse Object. Die Klasse Object

2 Eine einfache Programmiersprache. Variablen. Operationen Zuweisung. Variablen

2 Eine einfache Programmiersprache

Wiederholung aus SWE2

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

IT I: Heute. Nachbetrachtung Wissensüberprüfungen. Einführung Vererbung. Roboter in becker.robots IT I - VO 5 1

Objektorientierung II & die Java Klassenbibliothek. Kristian Bergmann und Arthur Lochstampfer

Transkript:

Annotation in Java 1.5 Metadaten Oliver Szymanski oliver.szymanski@mathema.de www.mathema.de

Themen Einstieg in Metadaten und Annotationen Zugriff auf Annotationen zur Laufzeit Zugriff auf Annotationen auf Quellcodeebene Standardannotationen Eigene Annotationen definieren

Metadaten Eine Vielzahl an Metadaten sind bei der Entwicklung erforderlich z.b. soll eine Klasse als Webservice verfügbar sein z.b. soll eine bestimmte Methode als UnitTest ausgeführt werden Vgl. Deployment Deskriptoren in J2EE oder Xdoclet (Metadaten in Kommentaren) Benötigt wurde eine Möglichkeit diese Metadaten direkt in Java zu formulieren Prüfung der Syntax / des Vorhandenseins durch den Compiler Metadaten direkt an richtiger Stelle

Annotationen Metadaten können ab Java 1.5 als Annotationen formuliert werden Annotationen sind Erweiterungen der Java-Sprache Beispiel einer Annotation: @Documented public class LibraryContext {... Im Beispiel wird der Klasse LibraryContext die Annotation Documented zugeordnet. Diese kann u.a. durch das ndoc -Tool ausgewertet werden.

Parameter zu Annotationen Annotationen können auch Parameter bekommen: import njunit.annotation.*; public class Example { @UnitTest(value="This test will pass.") public void pass() { assert 10 > 5; Im Beispiel wird eine Annotation aus dem UnitTest-Framework genutzt. Diese kennzeichnet Methoden, welche als UnitTest ausgeführt werden sollen, als Parameter wird die Beschreibung des UnitTests angegeben.

Parameter zu Annotationen Parameter sind Name/Wert Paare Mehrere Parameter werden durch Komma getrennt angegeben Die Reihenfolge bei Parametern ist egal Gibt es nur einen Parameter kann man auf den Parameternamen verzichten und nur den Wert angeben

Annotationen zur Laufzeit Man kann Annotationen von Typen per Reflection abfragen Dazu gibt es das Interface java.lang.reflect.annotatedelement Folgende Typen implementieren dieses Interface: java.lang.reflect.accessibleobject java.lang.class java.lang.reflect.constructor java.lang.reflect.field java.lang.reflect.method java.lang.package

Das Interface AnnotatedElement boolean isannotationpresent (Class<? extends Annotation> annotationtype) Liefert true wenn der als Parameter übergebene Typ als Annotation an dem Element vorhanden ist, sonst false <T extends Annotation> T getannotation (Class<T> annotationtype) Liefert die Annotation des übergebenen Typs, wenn zu dem Element eine vorliegt, sonst null Annotation[] getannotations() Liefert alle zu dem Element vorliegende Annotationen Annotation[] getdeclaredannotations() Liefert die direkt angegebenen Annotationen, nicht geerbte

Annotationen zur Laufzeit Bsp. die Klasse Testrunner, welche die UnitTest einer Klasse ausführt: import java.lang.reflect.*; import njunit.annotation.*; public class TestRunner { static void executeunittests(string classname) { try { Object testobject = Class.forName(className).newInstance(); Method [] methods = testobject.getclass().getdeclaredmethods(); for(method amethod : methods) { UnitTest utannotation = amethod.getannotation(unittest.class); if(utannotation!=null) { System.out.print(utAnnotation.value() + " : " ); String result = invoke(amethod, testobject); // invoke per Reflection hier nicht gezeigt System.out.println(result); catch(exception x) { x.printstacktrace();...

Annotationen auf Quellcodeebene Quellcodeanalyse von Annotationen kann z.b. mit Hilfe der Doclet API implementiert werden: import com.sun.javadoc.*; public class ListAnnotations { public static boolean start(rootdoc root) { ClassDoc[] classes = root.classes(); for (ClassDoc clsdoc : classes) { process(clsdoc); return true; static void process(classdoc clsdoc) { System.out.println("Annotations in " + clsdoc.name() + ":"); AnnotationDesc[] anndescs = clsdoc.annotations(); for (AnnotationDesc ad : anndescs) { AnnotationTypeDoc at = ad.annotationtype(); System.out.println("Annotation: " + at.name()); AnnotationDesc.MemberValuePair [] members = ad.membervalues(); for(annotationdesc.membervaluepair mvp : members) { System.out.println("member = " + mvp.member().name() + ", value = "+ mvp.value() + "");

Kompilieren Quellcodenanalyse von Annotationen javac -source 1.5 -cp c:\jdk15\lib\tools.jar ListAnnotations.java Starten des Doclets javadoc -source 1.5 -doclet ListAnnotations -sourcepath. UnitTest.java

Standardannotationen Es gibt sechs fertige Annotationen: @Deprecated Ersetzt den deprecated -javadoc-tag. Compiler warnt, wenn ein Element mit dieser Annotation genutzt wird. @Overrides Wird bei Methoden genutzt, um anzugeben, dass man die Methode überschreiben möchten. Führt zu einem Compilerfehler, wenn man eine Methode irrtümlich nicht überschreibt sondern überlädt. @Documented Für Typen die in (Javadoc-) Dokumentationen aufgenommen werden sollen.

Standardannotationen @Inherited Kann für eigenen Annotationen gesetzt werden, und bedeutet das diese vererbt werden, wenn sie zu einer Klasse gesetzt werden @Target Kann für eigene Annotationen gesetzt werden. Gibt den Typ an, auf den eine Annotation angewendet werden darf. Z.B.: @Target({ElementType.FIELD, ElementType.METHOD).Die möglichen Werte liegen in der Enumeration ElementType. @Retention Gibt an, wann die Annotation zur Verfügung steht und ausgewertet werden kann. Möglich ist Auswertung nur im Quellcode, vom Compiler, zur Laufzeit.

@Deprecated @Overrides Beispiele zu den Standardannotationen public class Parent { @Deprecated public void foo(int x) { System.out.println("This method is deprecated and should not be used."); class A { public void f(a a) {... class B extends A { public void f(b a) {... // gewünscht war eigentlich f(a a) // zu überschreiben nicht zu überladen class C extends A { @Overrides public void f(a a) {... // überschreiben: OK @Overrides public void f(b a) {... // überladen: ERROR

Eigene Annotation erstellen Annotationen werden ähnlich einem Interface mit @interface definiert extends darf nicht genutzt werden (Annotationen erweitern automatisch das neue Marker-Interface java.lang.annotation.annotation) Angegebene Methoden haben keine Parameter Methoden haben keine Typ-Parameters (keine generischen Methoden) Methodrückgabetypen sind beschränkt auf primitive Type, String, Class, enum-typen, Annotation-typen, und Arrays von diesen Throws darf nicht deklariert werden Annotationstypen dürfen nicht parametrisiert werden

Eigene Annotationen erstellen Einfache Annotation zur Markierung public @interface Preliminary { Einfache Annotation primitiven Werttypen public @interface RequestForEnhancement { int id(); // Unique ID number associated with RFE String synopsis(); // Synopsis of RFE String engineer(); // Name of implementor String date(); // Date RFE was implemented public @interface Authors { String[] names(); Array werden dann als Parameter wie folgt angegeben: @Authors({"xyz", "abc") Soll nur ein Wert übergebenen werden, kann man die geschweiften Klammern wegfallen lassen

Eigene Annotationen erstellen Komplexe Annotation public @interface Name { String first(); String last(); public @interface Author { Name value(); public @interface Reviewer { Name value(); werden wie folgt genutzt: @Author(@Name(first = "Joe", last = "Hacker"))

Eigene Annotationen erstellen Typ-gebundene Annotationen public interface Formatter {... /** * Designates a formatter to pretty-print the annotated class. */ public @interface PrettyPrinter { Class<? extends Formatter> value(); Default-Werte können definiert werden, so dass die Angabe des Parameters bei Nutzung der Annotation nicht mehr nötig ist: public @interface RequestForEnhancement { int id(); // No default String synopsis(); // No default String engineer() default "[unassigned]"; String date() default "[unimplemented]";

Defaultwerte Annotationen können problemlos um Attribute mit Default- Werten erweitert werden, ansonsten: IncompleteAnnotationError Entfernen eines Attributs führt zu einem NoSuchMethodError Ändern eines Attribut-Typs führt ggf. zu einem AnnotationTypeMismatchError Entfernen von Defaults führt ggf. zu einem IncompleteAnnotationError Ein ändern der Retention-Politik oder von Targets kann zu Problemen zur Übersetzungszeit und oder Laufzeit führen

Beispiele Source-Level-Annotation: @Retention(SOURCE) public @interface Copyright { String text(); Werte für Retention kommen aus RetentionPolicy. Möglich ist: SOURCE: Annotationen landen nicht im Class-File CLASS: Annotationen landen im Class-File, werden aber nicht zur Laufzeit ausgewertet (Default, wenn Retention nicht angegeben wird) RUNTIME: Annotation landen im Class-File und können zur Laufzeit per Reflection ausgewertet werden

Beispiele Definition der Inherited-Annotation: @Documented @Retention(RUNTIME) @Target(ANNOTATION_TYPE) public @interface Inherited { Definition der Retention-Annotation: @Documented @Retention(RUNTIME) @Target(ANNOTATION_TYPE) public @interface Retention { RetentionPolicy value(); Definition der Target-Annotation: @Documented @Retention(RUNTIME) @Target(ANNOTATION_TYPE) public @interface Target { ElementType[] value;

Vielen Dank! oliver.szymanski@mathema.de www.mathema.de