Java. Platformy apod.

Podobné dokumenty
Java. Generické typy

Java. Platformy apod.

JAVA. Zdrojové soubory

JAVA V Assertions Java, zimní semestr

Parametrizované třídy Generics generické třídy. JDK zavádí mimo jiné tzv. parametrizované třídy - generics

Pokročilé programování na platformě Java. Úvod

JAVA Moduly Java, letní semestr 2018

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Java Výjimky Java, zimní semestr

Algoritmizace a programování

JAVA. Krátce o Reflection API

Java Enum Java, zimní semestr ,2017 1

Úvodní informace. Petr Hnětynka 2/2 Zk/Z

Platformy NetBean a Eclipse. Úvod

Iterator & for cyklus

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

Generické typy. Podrobněji: The Java Language Specification ( Third Edition ) , 18

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Úvod do programovacích jazyků (Java)

Generické programování

Teoretické minimum z PJV

Programování v Javě I. Únor 2009

Úvodní informace. Petr Hnětynka 2/2 Zk/Z

Návrhové vzory Tvorba objektů

Úvod do programování v jazyce Java

Programování v Javě I. Leden 2008

Úvodní informace. Petr Hnětynka 2/2 Zk/Z

typová konverze typová inference

Výčtový typ strana 67

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Platformy NetBean a Eclipse. Úvod

Návrh softwarových systém. Návrh softwarových systémů

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Seminář Java II p.1/43

boolean hasnext() Object next() void remove() Kolekce

Generické programování v jazyce Java Generics programming in Java

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Java Řetězce Java, zimní semestr

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Seminář Java IV p.1/38

JAVA. Další jazyky kompilovatelné do Java byte-code

Reflexe RTTI Runtime Type Identification

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

7. Dynamické datové struktury

RMI Remote Method Invocation

UJO Framework. revoluční architektura beans. verze

JAVA Unit testing Java, zimní semestr

Z. Kotala, P. Toman: Java ( Obsah )

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Podmínky na zápočet. Java, zimní semestr

Typický prvek kolekce pro české řazení

O autorovi O odborném korektorovi Úvod 17 Vývoj jazyka Java Java SE 8 Struktura této knihy Předchozí zkušenosti s programováním nejsou potřebné

7. Datové typy v Javě

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

9. přednáška - třídy, objekty

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Java a XML. 10/26/09 1/7 Java a XML

PREPROCESOR POKRAČOVÁNÍ

Vytváření a použití knihoven tříd

Úvod do programování v jazyce Java

Abstraktní datové typy: zásobník

Zápis programu v jazyce C#

Dědičnost (inheritance)

PŘETĚŽOVÁNÍ OPERÁTORŮ

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Programovací jazyk Java

Vláknové programování část V

1. Programování proti rozhraní

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová

Lambda funkce Novinky v interfaces Streamy Optional - aneb zbavujeme se null. Java 8. Ondřej Hrstka

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Základy programovaní 3 (Java)

Paměť počítače. alg2 1

Úvod do programovacích jazyků (Java)

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Jazyk C# (seminář 6)

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

8 Třídy, objekty, metody, předávání argumentů metod

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

KTE / ZPE Informační technologie

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Úvod. Únor Fakulta informačních technologií VUT. Radek Kočí Seminář Java Úvod 1/ 23

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Programování v jazyce Java. Tomáš Pitner, upravil Marek Šabo

JAVA Moduly Java, letní semestr 2019

Anotace a Hibernate. Aleš Nosek Ondřej Vadinský Daniel Krátký

20. Projekt Domácí mediotéka

Úvod do programovacích jazyků (Java)

Dědění, polymorfismus

Matematika v programovacích

Jazyk C# (seminář 3)

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

JAVA. Krátke poznámky:

JAVA. Reflection API

Transkript:

Java Platformy apod.

Java objektově orientovaný vše (téměř) je objekt výjimka primitivní typy interpretovaný zdrojový kód (.java) překlad do tzv. bytecode bytecode (.class) interpretován v tzv. virtual machine nezávislý na architektuře programy běží ve virtual machine

Historie JDK 1.0 1996 JDK 1.1 1997 Vnitřní třídy Java 2 platform 2000 JDK 1.2, 1.3 změny pouze v knihovnách JDK 1.4 2002 Assert JDK 5.0 2004 změny v jazyce generické typy (~ šablony) anotace... JDK 6 2006 JDK 7 2011 malé změny v jazyce JDK 8 2014 velké změny v jazyce

Java platform JSE standard edition JEE enterprise edition JME micro edition JEE JSE JME Java Card API

"Výkon" původně (~ JDK 1.1, 1998) Java programy 6x pomalejší než C nyní: Just-In-Time (JIT) compilation v rámci spuštění se program přeloží provádí se nativní kód pomalý start, pak rychlé výkon ~ srovnatelný s normálními aplikacemi velká "spotřeba" paměti

Implementace Javy Oracle "oficiální" implementace Windows, Solaris, Linux OpenJDK http://openjdk.java.net/ open-source podporováno Oracle oficiální implementace vychází z OpenJDK IcedTea http://icedtea.classpath.org/ založeno na OpenJDK zcela free IBM IBM JDK

Implementace Javy Jikes RVM Research Virtual Machine open-source pro testování různých rozšíření napsáno v Javě "self-hosting" nepotřebuje k běhu jinou JVM boot-image writer Java program, spustí se pod existující JVM boot-image loader program v C++ nepodporuje celé Java API

Další... (spíše už historické ) Blackdown (do 1.5) open-source implementace JVM pro Linux založená na kódu Sun JVM Jikes Jikes překladač open-source rychlý striktní kompatibila s Javou (do 1.5) GNU classpath implementace základních Java knihoven Guavac překladač Kaffe virtual machine Apache Harmony open source Java SE...

Android zdroj: http://developer.android.com/

Bck2brwsr http://wiki.apidesign.org/wiki/bck2brwsr Java běžící v prohlížeči Cíle projektu Create small Java capable to boot fast and run in 100% of modern browsers including those that have no special support for Java. Demonstrate that Java has benefits over JavaScript when creating larger HTML5 applications...

Popularita zdroj: http://www.tiobe.com/tiobe_index

Popularita zdroj: http://www.tiobe.com/tiobe_index

JAVA Historie a budoucnost

Změny v jazyce od Java 5 static import auto-boxing a auto-unboxing nový for cyklus generické typy výčtový typ enum metody s proměnným počtem parametrů (printf) anotace (metadata)

Java 7, 8 Java 6 změny pouze v knihovnách Java 7 2011 mírné změny v jazyce Java 8 2014 větší změny v jazyce Java 8 will be revolution, not evolution Mark Reinhold, konference JavaOne, říjen 2011 ale září 2012 zrušení plánů na modularizaci modularizace odsunuta do verze 9

Java 7 změny změny v syntaxi podpora dynamických jazyků (nová instrukce v bytekódu) změny v NIO Nimbus (Swing LaF) nová verze JDBC...

Java 7 změny v syntaxi zápis konstant binární konstanty 0b010101 oddělení řádu v konstantách pomocí podtržítek 1_000_000 String v switch příkazu String month;... switch (month) { case "January": case "February":...

Java 7 změny v syntaxi operátor <> zjednodušená vytváření generických typů typ u new se automaticky odvodí př. List<String> list = new ArrayList<>(); List<List<String>> list = new ArrayList<>(); List<List<List<String>>> list = new ArrayList<>(); Map<String, Collection<String>> map = new LinkedHashMap<>(); otázka Proč není new bez <>? Tj. např. List<String> list = new ArrayList();

Java 7 změny v syntaxi interface AutoClosable a rozšířený try př: class Foo implements AutoClosable {... public void close() { try ( Foo f1 = new Foo(); Foo f2 = new Foo() ) {... catch ( ) {... finaly {... při ukončení try (normálně nebo výjimkou) se vždy zavolá close() na objekty z deklarace v try volá se v opačném pořadí než deklarováno

Java 7 změny v syntaxi rozšíření catch na více výjimek př: try {... catch (Exception1 Exception2 ex) {... lepší typová kontrola výjimek při re-throw

Je tento kód správně private void foo(int i) throws Ex1, Ex2 { try { if (i < 0) { throw new Ex1(); else { throw new Ex2(); catch (Exception ex) { throw ex; v Java 7 ano v Java 6 ne kompilátor vypíše chybu zde

Java 8 type annotations lze anotovat použití typů opakování stejné anotace deafult a static metody v interfacech lambda výrazy odvození typu u generických typů rozšíření std knihovny profily podmnožina std knihovny javac -profile...

Java 9 Moduly Problémy aktuální Javy problémy s CLASSPATH nelze deklarovat explicitně závislosti nelze skrýt veřejné typy Cíle modulů spolehlivá konfigurace silné zapouzdření

Moduly (Java 9) Modul pojmenovaná a sebe-popisujicí kolekce balíčků (packages) s typy (třídy,...) a daty deklaruje závislosti (vyžadované moduly) poskytované balíčky module-info.class module com.foo.bar { requires com.foo.baz; exports com.foo.bar.alpha; exports com.foo.bar.beta;

Moduly (Java 9) modulární JAR JAR s module-info.java JMOD nový formát pro distribuování modulů module path vyhledávání modulů

Moduly (Java 9) JSE platforma rozdělena na moduly module java.base { exports java.io; exports java.lang; exports java.lang.annotation; exports java.lang.invoke; exports java.lang.module; exports java.lang.ref; exports java.lang.reflect; exports java.math; exports java.net;...

Moduly (Java 9) Nepojmenovaný modul vidí všechny ostatní moduly poskytuje vše veřejné zpětná kompatibilita s CLASSPATH

Java Různé... Java, letní semestr 2015 18.2.2015

Typový systém silně typovaný jazyk třídy (class) primitivní typy (int, boolean, char,...) "vše" je v nějaké třídě neexistují globální proměnné, funkce,... obdoba jsou static metody a atributy Java, letní semestr 2015 18.2.2015

Test public class InitTest { static int i = 1; { i+=2; ; static { i++; ; public static void main(string argv[]) { System.out.println(i); System.out.println(new InitTest().i); ; ; Program vypíše: a) 2 4 b) 1 3 c) 3 5 d) 4 4 e) nelze přeložit Java, letní semestr 2015 18.2.2015

Řešení testu správně je a) 2 4 {... v definici třídy inicializátor provádí se při vytváření nové instance používá se pro inicializaci anonymních vnitřních tříd static {... statický inicializátor provádí se při "natažení" třídy do VM může pracovat pouze se static prvky třídy Java, letní semestr 2015 18.2.2015

Test 2 public class InitTest { static int i = 1; { i+=2; ; public InitTest() { System.out.println(i++); static { i++; ; public static void main(string argv[]) { System.out.println(i); System.out.println(new InitTest().i); ; ; Výsledek: a) 1 3 5 b) 2 3 5 c) 2 4 5 Java, letní semestr 2015 18.2.2015

Řešení testu 2 správně je C) 2 4 5 inicializátor se provádí před konstruktorem nejdříve se inicializuje předek inicializátory a konstruktor Java, letní semestr 2015 18.2.2015

Výjimky a inicializátory inicializátory mohou "vyhazovat" pouze výjimky, které jsou definovány v konstruktorech musí být definován alespoň jeden konstruktor inicializátory anonymních tříd mohou vyhazovat jakékoliv výjimky třída se vytváří pouze jednou není problém výjimku odchytit / deklarovat Java, letní semestr 2015 18.2.2015

Statické inicializátory musí skončit normálně jinak nelze přeložit prováděny v pořadí podle výskytu ve zdrojovém souboru nemohou obsahovat return nelze přeložit Java, letní semestr 2015 18.2.2015

Vlákna Java Language Specification definuje "memory model" určuje možná chování programu (ve vztahu k vláknům) pro daný program a průběh výpočtu určí, zda průběh výpočtu je legální volatile atributy tříd vždy v konzistentním stavu vlákna můžou mít zkopírované ne-volatile atributy do svojí paměti důvod = rychlost změny ne-volatile atributů nemusejí být ihned vidět z jiných vláken přiřazení (i čtení) do primitivních typů <= 32 bitů atomické tj. long a double nejsou ale pokud jsou volatile, tak ano přiřazení (čtení) referencí - atomické Java, letní semestr 2015 18.2.2015

Viditelnost ve třídách lze změnit viditelnost elementů v potomcích? např. class A { public void foo() { class B extends A { private void foo() { viditelnost lze zmírnit ale nelze zpřísnit proč pokud by bylo class A { public void foo() { class B extends A { private void foo() { pak by šlo následující A a = new B(); a.foo(); Java, letní semestr 2015 18.2.2015

Java Generické typy

Úvod obdoba šablon z C#/C++ na první pohled parametry pro typy cíl přehlednější kód typová bezpečnost

Motivační příklad bez gen. typů (<=JDK 1.4) List myintlist = new LinkedList(); myintlist.add(new Integer(0)); Integer x = (Integer)myIntList.iterator().next(); JDK 5 List<Integer> myintlist = new LinkedList<Integer>(); myintlist.add(new Integer(0)); Integer x = myintlist.iterator().next(); bez explicitního přetypování kontrola typů během překladu

Definice generických typů public interface List<E> { void add(e x); Iterator<E> iterator(); E get(int i); public interface Iterator<E> { E next(); boolean hasnext(); List<Integer> si lze představit jako public interface IntegerList { void add(integer x); Iterator<Integer> iterator(); ve skutečnosti ale takový kód nikde neexistuje negeneruje se kód jako C++

Vztahy mezi typy nejsou povoleny žádné změny v typových parametrech List<String> ls = new ArrayList<String>(); List<Object> lo = ls; lo.add(new Object()); String s = ls.get(0); chyba přiřazení Object do String druhý řadek způsobí chybu při překladu List<String> není podtyp List<Object>

Vztahy mezi typy příklad tisk všech prvků kolekci <= JDK 1.4 void printcollection(collection c) { Iterator i = c.iterator(); for (k = 0; k < c.size(); k++) { System.out.println(i.next()); naivní pokus v JDK 5 void printcollection(collection<object> c) { for (Object e : c) { System.out.println(e); nefunguje (viz předchozí příklad)

Vztahy mezi typy Collection<Object> není nadtyp všech kolekcí správně void printcollection(collection<?> c) { for (Object e : c) { System.out.println(e); Collection<?> je nadtyp všech kolekcí kolekce neznámého typu (collection of unknown) lze přiřadit kolekci jakéhokoliv typu pozor - do Collection<?> nelze přidávat Collection<?> c = new ArrayList<String>(); c.add(new Object()); <= chyba při překladu volat get() lze - vysledek do typu Object

Vztahy mezi typy? - wildcard omezený? (bounded wildcard) public abstract class Shape { public abstract void draw(canvas c); public class Circle extends Shape {... public class Canvas { public void drawall(list<shape> shapes) { for (Shape s:shapes) { s.draw(this) umožní vykreslit pouze seznamy přesně typu List<Shape>, ale už ne List<Circle>

Vztahy mezi typy řešení - omezený? public void drawall(list<? extends Shape> shapes){ for (Shape s:shapes) { s.draw(this) do tohoto Listu stále nelze přidávat shapes.add(0, new Rectangle()); chyba při překladu

Generické metody static void fromarraytocollection(object[] a, Collection<?> c) { for (Object o : a) { c.add(o); chyba při překladu static <T> void fromarraytocollection(t[] a, Collection<T> c) { for (T o : a) { c.add(o); OK

Generické metody použití překladač sám určí typy Object[] oa = new Object[100]; Collection<Object> co = new ArrayList<Object>(); fromarraytocollection(oa, co); // T Object String[] sa = new String[100]; Collection<String> cs = new ArrayList<String>(); fromarraytocollection(sa, cs); // T String fromarraytocollection(sa, co); // T Object i u metod lze použít omezený typ class Collections { public static <T> void copy(list<t> dest, List<? extends T> src){...

Odvození typu ne vždy je kompilátor schopen typ určit příklad class Collections { static <T> List<T> emptylist(); List<String> listone = Collections.emptyList(); OK void processstringlist(list<string> s) {.. processstringlist(collections.emptylist()); nelze přeložit (v Java 7)

Odvození typu překladači lze napovědět processstringlist(collections.<string>emptylist()); v Java 8 příklad lze přeložit i bez nápovědy zlepšeno odvozování typů

Generické metody a? kdy použít generické metody a kdy "wildcards" interface Collection<E> { public boolean containsall(collection<?> c); public boolean addall(collection<? extends E> c); interface Collection<E> { public <T> boolean containsall(collection<t> c); public <T extends E> boolean addall(collection<t> c); Co je vhodnější?

Generické metody a? kdy použít generické metody a kdy "wildcards" interface Collection<E> { public boolean containsall(collection<?> c); public boolean addall(collection<? extends E> c); interface Collection<E> { public <T> boolean containsall(collection<t> c); public <T extends E> boolean addall(collection<t> c); generické metody vztahy mezi více typy

Generické metody a? lze použít generické metody i "wildcards" najednou class Collections { public static <T> void copy(list<t> dest, List<? extends T> src) {... lze napsat i jako class Collections { public static <T, S extends T> void copy(list<t> dest, List<S> src) {... "správně" je první zápis

Pole a generické typy pole gen. typů lze deklarovat nelze naalokovat List<String>[] lsa = new List<String>[10]; nelze! List<?>[] lsa = new List<?>[10]; OK + varování proč - pole lze přetypovat na Object List<String>[] lsa = new List<String>[10]; Object[] oa = (Object[]) o; List<Integer> li = new ArrayList<Integer>(); li.add(new Integer(3)); oa[1] = li; String s = lsa[1].get(0); ClassCastException

Starý a nový kód starý kód bez generických typů public class Foo { public void add(list lst) {... public List get() {... nový kód používající starý List<String> lst1 = new ArrayList<String>(); Foo o = new Foo(); o.add(lst1); OK - List odpovídá List<?> List<String> lst2 = o.get(); varování překladače

Starý a nový kód nový kód s generickými typy public class Foo { public void add(list<string> lst) {... public List<String> get() {... starý kód používající nový List lst1 = new ArrayList(); Foo o = new Foo(); o.add(lst1); varování překladače List lst2 = o.get(); OK - List odpovídá List<?>

"Erasure" public String loophole(integer x) { List<String> ys = new LinkedList<String>(); List xs = ys; xs.add(x); varování return ys.iterator().next(); při běhu se tento kód chová jako public String loophole(integer x) { List ys = new LinkedList(); List xs = ys; xs.add(x); return (String)ys.iterator().next(); běhová chyba

"Erasure" při překladu se vymažou všechny informace o generických typech "erasure" typové parametry se zruší (List<Integer> List) typové proměnné jsou nahrazeny nejobecnějším typem přidána přetypování

Kód generických tříd List<String> l1 = new ArrayList<String>(); List<Integer> l2 = new ArrayList<Integer>(); System.out.println(l1.getClass() == l2.getclass()); Co vypíše? a) true b) false

Kód generických tříd List<String> l1 = new ArrayList<String>(); List<Integer> l2 = new ArrayList<Integer>(); System.out.println(l1.getClass() == l2.getclass()); Co vypíše? a) true b) false

Přetypování, instanceof Collection cs = new ArrayList<String>(); if (cs instanceof Collection<String>)... nelze Collection<String> cstr = (Collection<String>) cs; varování za běhu nelze zajistit <T> T badcast(t t, Object o) {return (T) o; varování <T> T[] makearray(t t) { return new T[100]; nelze

java.lang.class java.lang.class je generický typ př. String.class je typu Class<String> class Class<E>... E newinstance() {......

Další vztahy mezi typy class Collections { public static <T> void copy(list<t> dest, List<? extends T> src){... ve skutečnosti class Collections { public static <T> void copy(list<? super T> dest, List<? extends T> src){... do kolekce <? super T> lze přidávat!

Další vztahy mezi typy super lze použít jen u gen. metod nelze u gen. typů nic by to nepřinášelo class Foo<T super Number > { private T v; public Foo(T t) { v = t; po erasure class Foo { private Object v; public Foo(Object t) { v = t; zajistilo by to pouze, že jako parametr lze použít nadtyp Number nezajistilo by to, že v prom. v bude vždy jen instance nadtypu Number

Převod "starého" kódu na nový interface Comparator<T> int compare(t fst, T snd); class TreeSet<E> { TreeSet(Comparator<E> c)... TreeSet<String> lze použít Comparator<String> i Comparator<Object> class TreeSet<E> { TreeSet(Comparator<? super E> c)...

Převod "starého" kódu na nový Collections { public static <T extends Comparable<T>> T max(collection<t> coll); class Foo implements Comparable<Object> {... Collection<Foo> cf =... Collections.max(cf) nefunguje lépe public static <T extends Comparable<? super T>> T max(collection<t> coll);

Převod "starého" kódu na nový public static <T extends Comparable<? super T>> T max(collection<t> coll); erasure public static Comparable max(collection coll) není kopatibilní se "starou" metodou max public static Object max(collection coll) správně public static <T extends Object & Comparable<? super T>> T max(collection<t> coll); lze několik typů: T1 & T2 &... & Tn pro "erasure" se vezme první z nich zcela správně public static <T extends Object & Comparable<? super T>> T max(collection<? extends T> coll);

Java Anotace

Přehled anotace ~ metadata data o datech přídavná informace o části programu, která nemá (přímo) vliv na funkčnost programu od JDK 5 příklady @Deprecated @SuppressWarnings @Override

Motivace pro zavedení anotací anotace v podstatě existovaly už před JDK 5 ale byly definovány nesystematicky a nešly přidávat (snadno) př: modifikátor transient @deprecated element v javadoc komentáři XDoclet http://xdoclet.sourceforge.net/ přidávání anotací do staré Javy jako definovatelné tagy v javadoc komentářích lze z nich generovat cokoliv obsahuje mnoho předdefinovaných tagů a transformací původně nástroj pro podporu vývoje EJB komponent

Používání anotace lze použít v podstatě na každý element programu třídy interfacy atributy metody konstruktory balíky použití typů (od Java 8) obecné pravidlo anotaci lze použít tam, kde lze použít nějaký modifikátor výjimka u anotací pro balíky (zapisují se do spec. souboru package-info.java) a použití typů při definici anotace lze omezit, na co půjde použít

Používání př: class A { @Override public boolean equals(a a) {... @Deprecated public void mydeprecatedmethod() {... anotace můžou mít parametry @SuppressWarnings("unchecked") public void foo() {

Používání anotace použití typů (Java 8) new @Interned MyObject(); mystring = (@NonNull String) str; class UnmodifiableList<T> implements @Readonly List<@Readonly T> {... void monitortemperature() throws @Critical TemperatureException {...

Používání lze použít mezi modifikátory v jakémkoliv pořadí konvence použít nejdřív anotace a pak modifikátory lze aplikovat libovolné množství anotací na jeden element Java 5-7 nelze aplikovat jednu anotaci vícekrát ani při použití různých parametrů Java 8 lze aplikovat jednu anotaci vícekrát

Definice podobně jako interface @interface metody bez implementace př. public @interface RequestForEnhancement { int id(); String synopsis(); String engineer() default "[unassigned]"; String date() default "[unimplemented]";

Definice speciální anotace marker bez těla anotace při použití nemá žádné parametry public @interface Preliminary { single-member jeden element value typ může být různý při použití se zapíše jen anotace a hodnota parametru public @interface Copyright { String value();

Definice použití našich anotací @RequestForEnhancement( id = 2868724, synopsis = "Enable time-travel", engineer = "Mr. Peabody", date = "4/1/3007" ) public static void travelthroughtime(date destination) {... @Preliminary public class TimeTravel {... @Copyright("2002 Yoyodyne Propulsion Systems") public class OscillationOverthruster {...

Definice stejné jako interface místo deklarace rozsah platnosti rozsah viditelnosti nesmějí být generickým typem nesmějí obsahovat extends implicitně dědí od java.lang.annotation.annotation libovolný počet elementů anotace T nesmí obsahovat element typu T přímo i nepřímo @interface SelfRef { SelfRef value(); @interface Ping { Pong value(); @interface Pong { Ping value();

Definice metody nesmějí mít žádné parametry metody nesmějí být generické deklarace metod nesmí obsahovat throws návratová hodnota musí být: primitivní typ String Class Enum anotace pole předchozích typů

Definice při použití musí anotace obsahovat dvojici element-hodnota pro každý element (metodu) z definice neplatí pro elementy s defaultní hodnotou hodnota nesmí být null

Předdefinované anotace anotace pro použití na anotacích ovlivňují možnosti použití anotace v balíku java.lang.annotation @Target single-member specifikuje, na jakém elementu lze anotaci použít možné hodnoty parametru (enum ElementType) ANNOTATION_TYPE CONSTRUCTOR FIELD LOCAL_VARIABLE PACKAGE METHOD PARAMETER TYPE použití na třídu, interface, enum, anotaci TYPE_PARAMETER od Java 8 TYPE_USE od Java 8

Předdefinované anotace @Retention single-member specifikuje, kde je anotace použitelná možné hodnoty parametru (enum RetentionPolicy) SOURCE pouze ve zdrojovém kódu CLASS v době kompilace RUNTIME při běhu programu @Retention(RetentionPolicy.RUNTIME) public @interface Foo {

Opakované použití anotace od Java 8 @Schedule(dayOfMonth="last") @Schedule(dayOfWeek="Fri", hour="23") public void foo() {... z důvodů kompatibility anotace vloženy automaticky do kontejneru kontejner se musí připravit @Repeatable(Schedules.class) public @interface Schedule {... public @interface Schedules { Schedule[] value;

Získání anotací za běhu pomocí Reflection API interface AnnotatedElement isannotationpresent zda je anotace přítomna getannotation vrátí anotaci daného typu, je-li přítomna getannotations vrátí všechny anotace getdeclaredannotations vrátí deklarované anotace (bez zděděných)

Zpracování SOURCE anotací anotační procesory specifikují se překladači parametr -processor javax.annotation.processing.processor od Java 6 Annotation Processing Tool (APT) externí nástroj pro zpracování anotací Java 5 od JDK 8 APT a související API označeno za deprecated

Příklad Unit Testing import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Test { public class Foo { @Test public static void m1() { public static void m2() {... @Test public static void m3() {...

Příklad Unit Testing import java.lang.reflect.*; public class RunTests { public static void main(string[] args) throws Exception { int passed = 0, failed = 0; for (Method m : Class.forName(args[0]).getMethods()) { if (m.isannotationpresent(test.class)) { try { m.invoke(null); passed++; catch (Throwable ex) { System.out.printf("Test %s failed: %s %n", m, ex.getcause()); failed++; System.out.printf("Passed: %d, Failed %d%n", passed, failed);

Java, letní semestr Verze prezentace 2015 AJ02.cz.2017.01 18.2.2015 Tato prezentace podléhá licenci Creative Commons Uveďte autora-neužívejte komerčně 4.0 Mezinárodní License. 88