Pokročilé programování na platformě JAVA, letní semestr...

88
Java, letní semestr 2017 27.2.2017 Java Java Platformy apod.

Transcript of Pokročilé programování na platformě JAVA, letní semestr...

Page 1: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

JavaJava

Platformy apod.

Page 2: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

JavaJava● 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

Page 3: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

HistorieHistorie● 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

Page 4: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Java platformJava platform● JSE – standard edition● JEE – enterprise edition● JME – micro edition

JSEJEE JMEJavaCardAPI

Page 5: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

"Výkon""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

Page 6: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Implementace JavyImplementace 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

Page 7: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Implementace JavyImplementace 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

Page 8: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Další... (spíše už „historické“)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● ...

Page 9: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

AndroidAndroid

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

Page 10: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Bck2brwsrBck2brwsr● 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“

– ...

Page 11: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

PopularitaPopularita

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

Page 12: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

PopularitaPopularita

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

Page 13: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

JAVAJAVA

Historie a budoucnost

Page 14: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Změny v jazyce od Java 5Změ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)

Page 15: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Java 7, 8Java 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

Page 16: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Java 7Java 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– ...

Page 17: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Java 7 – změny v syntaxiJava 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": ... }

Page 18: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Java 7 – změny v syntaxiJava 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ázkaProč není new bez <> ? Tj. např.List<String> list = new ArrayList();

Page 19: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Java 7 – změny v syntaxiJava 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

Page 20: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Java 7 – změny v syntaxiJava 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

Page 21: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Je tento kód správně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

Page 22: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Java 8Java 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 ...

Page 23: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Java 9Java 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í

Page 24: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Moduly (Java 9)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 com.foo.bar { requires com.foo.baz; exports com.foo.bar.alpha; exports com.foo.bar.beta;}

module-info.class

Page 25: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Moduly (Java 9)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ů

Page 26: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Moduly (Java 9)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; ...}

Page 27: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Moduly (Java 9)Moduly (Java 9)● Nepojmenovaný modul

– vidí všechny ostatní moduly– poskytuje vše veřejné

– zpětná kompatibilita s CLASSPATH

Page 28: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201518.2.2015

JavaJava

Různé...

Page 29: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201518.2.2015

Typový systémTypový 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

Page 30: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201518.2.2015

TestTestpublic 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 4b) 1 3c) 3 5d) 4 4e) nelze přeložit

Page 31: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201518.2.2015

Řešení testuŘ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

Page 32: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201518.2.2015

Test 2Test 2public 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 5b) 2 3 5c) 2 4 5

Page 33: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201518.2.2015

Řešení testu 2Ř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

Page 34: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201518.2.2015

Výjimky a inicializátoryVý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

Page 35: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201518.2.2015

Statické inicializátoryStatické 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

Page 36: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201518.2.2015

VláknaVlá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é

Page 37: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201518.2.2015

Viditelnost ve třídách 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 byloclass A { public void foo() {} }class B extends A { private void foo() {} }

– pak by šlo následujícíA a = new B();a.foo();

Page 38: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

JavaJava

Generické typy

Page 39: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

ÚvodÚvod● obdoba šablon z C#/C++

– na první pohled● parametry pro typy● cíl

– přehlednější kód– typová bezpečnost

Page 40: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Motivační příkladMotivač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

Page 41: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Definice generických typů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++

Page 42: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Vztahy mezi typyVztahy mezi typy● nejsou povoleny žádné změny v typových

parametrech

List<String> ls = new ArrayList<String>();List<Object> lo = ls;

– druhý řadek způsobí chybu při překladu– List<String> není podtyp List<Object>

lo.add(new Object());String s = ls.get(0); chyba – přiřazení Object do String

Page 43: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Vztahy mezi typyVztahy 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)

Page 44: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Vztahy mezi typyVztahy 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

Page 45: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Vztahy mezi typyVztahy 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>

Page 46: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Vztahy mezi typyVztahy 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

Page 47: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Generické metodyGenerické metodystatic void fromArrayToCollection(Object[] a, Collection<?> c) {

for (Object o : a) { c.add(o); }}

static <T> void fromArrayToCollection(T[] a, Collection<T> c) {

for (T o : a) { c.add(o); }}

← chyba při překladu

← OK

Page 48: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Generické metodyGenerické metody● použití

– překladač sám určí typy

Object[] oa = new Object[100];Collection<Object> co = new ArrayList<Object>();fromArrayToCollection(oa, co); // T → ObjectString[] sa = new String[100];Collection<String> cs = new ArrayList<String>();fromArrayToCollection(sa, cs); // T → StringfromArrayToCollection(sa, co); // T → Object

● i u metod lze použít omezený typclass Collections { public static <T> void copy(List<T> dest, List<? extends T> src){...}

}

Page 49: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Odvození typuOdvození typu● ne vždy je kompilátor schopen typ určit

– příkladclass 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)

Page 50: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Odvození typuOdvození 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ů

Page 51: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Generické metody a ?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ší?

Page 52: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Generické metody a ?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

Page 53: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Generické metody a ?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

Page 54: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Pole a generické typyPole 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

Page 55: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

„„Starý“ a „nový“ kódStarý“ 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

Page 56: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

„„Starý“ a „nový“ kódStarý“ 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<?>

Page 57: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

"Erasure""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}

Page 58: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

"Erasure""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í

Page 59: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Kód generických třídKó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) trueb) false

Page 60: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Kód generických třídKó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) trueb) false

Page 61: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Přetypování, instanceofPřetypování, instanceofCollection 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}

Page 62: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

java.lang.Classjava.lang.Class● java.lang.Class je generický typ

– př. String.class je typu Class<String>

class Class<E> .... E newInstance() {....} ....}

Page 63: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Další vztahy mezi typyDalší vztahy mezi typyclass 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!

Page 64: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Další vztahy mezi typyDalší vztahy mezi typy● super lze použít jen u gen. metod● nelze u gen. typů

– nic by to nepřinášeloclass Foo<T super Number > { private T v; public Foo(T t) { v = t; }}

– po erasureclass 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

Page 65: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Převod "starého" kódu na nový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) ... }

Page 66: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Převod "starého" kódu na nový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épepublic static <T extends Comparable<? super T>> T max(Collection<T> coll);

Page 67: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Převod "starého" kódu na nový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);

Page 68: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

JavaJava

Anotace

Page 69: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

PřehledPř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

Page 70: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Motivace pro zavedení anotací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

Page 71: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Používání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é pravidloanotaci 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

Page 72: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Používání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() {

Page 73: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Používání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 { ... }

Page 74: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Používání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

Page 75: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

DefiniceDefinice● podobně jako interface

● @interface● metody bez implementace

● př.

public @interface RequestForEnhancement { int id(); String synopsis(); String engineer() default "[unassigned]"; String date() default "[unimplemented]"; }

Page 76: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

DefiniceDefinice● „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(); }

Page 77: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

DefiniceDefinice● 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 { ... }

Page 78: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

DefiniceDefinice● 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(); }

Page 79: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

DefiniceDefinice● 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ů

Page 80: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

DefiniceDefinice● 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

Page 81: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Předdefinované anotacePř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

Page 82: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Předdefinované anotacePř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 { }

Page 83: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Opakované použití anotaceOpakované 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;}

Page 84: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Získání anotací za běhuZí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)

Page 85: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Zpracování SOURCE anotací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“

Page 86: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Příklad – Unit TestingPříklad – Unit Testingimport 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() { ... }}

Page 87: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201727.2.2017

Příklad – Unit TestingPříklad – Unit Testingimport 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); }}

Page 88: Pokročilé programování na platformě JAVA, letní semestr 2017hnetynka/teaching/vsjava/slides2017/... · Java, letní semestr 2017 27.2.2017 Historie JDK 1.0 – 1996 JDK 1.1

Java, letní semestr 201518.2.2015 88

Tato prezentace podléhá licenci Creative Commons Uveďte autora-Neužívejte komerčně 4.0 Mezinárodní License.

Verze prezentace AJ02.cz.2017.01