JAVA Moduly Java, letní semestr 2019

Podobné dokumenty
JAVA Moduly Java, letní semestr 2018

JAVA. Krátce o Reflection API

JAVA V JDBC Java, letní semestr

JAVA JDBC Java, letní semestr 2018

Google Web Toolkit. Martin Šurkovský, SUR března Katedra informatiky

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

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

RMI Remote Method Invocation

Úvod do programovacích jazyků (Java)

UJO Framework. revoluční architektura beans. verze

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

Programování v Javě I. Leden 2008

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

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

Algoritmizace a programování

OSGi. Aplikační programování v Javě (BI-APJ) - 6 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Algoritmizace a programování. Terminálový vstup a výstup

Seminář Java II p.1/43

Integrace OpenOffice.org a Javy. CZJUG, , Robert Vojta

NetBeans platforma. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

TÉMATICKÝ OKRUH Softwarové inženýrství

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Platformy NetBean a Eclipse. Úvod

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

Jazyk C# (seminář 6)

Úvod do programovacích jazyků (Java)

Distribuované systémy a výpočty

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

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

Java Enum Java, zimní semestr ,2017 1

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

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

Teoretické minimum z PJV

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/

Skriptovací jazyky. Obsah

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

Generické programování

Vytváření uživatelských datových typů a funkcí v Javě

Platformy NetBean a Eclipse. Úvod

JAVA V RMI Java, letní semestr

Vaše jistota na trhu IT. Balíčky. Rudolf Pecinovský

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

Groovy agilní Java. Pavel Kříž Filip Malý

Tvorba informačních systémů

Doxygen. Jakub Břečka

typová konverze typová inference

Algoritmizace a programování

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu

Remote Method Invocation RMI

ANT. Aplikační programování v Javě (BI-APJ) - 1 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

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

20. Projekt Domácí mediotéka

1. Téma 12 - Textové soubory a výjimky

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

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

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

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

JAVA RMI Java, letní semestr 2018

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

1. Programování proti rozhraní

Abstraktní datové typy: zásobník

1 - Úvod do platformy.net. IW5 - Programování v.net a C#

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

Technologie Java Enterprise Edition. Přemek Brada, KIV ZČU

Java Cvičení 01. CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics

10 Balíčky, grafické znázornění tříd, základy zapozdření

Instalace a konfigurace web serveru. WA1 Martin Klíma

Výčtový typ strana 67

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

STARÁ DOBRÁ JAVA A PERSISTENCE S CACHÉ

Úvod do programování - Java. Cvičení č.4

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové aplikace

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

ProjectWise V8 XM Edition

Projekty pro výuku programování v jazyce Java

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

RMI - Distribuované objekty v Javě

2015 GEOVAP, spol. s r. o. Všechna práva vyhrazena.

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

Programátorská příručka

Reflexe RTTI Runtime Type Identification

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

Úvod do Web Services

Stream API. Petr Krajča. Základy programovaní 4 (Java) Katedra informatiky Univerzita Palackého v Olomouci

GUI. JavaFX. Java UI, letní semestr 2017/2018 1

IB111 Programování a algoritmizace. Programovací jazyky

Programovací jazyk Java

Rozhraní SAX, SAX vs. SAX2. Jaroslav Ciml

Regulární výrazy. Vzory

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

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

Iterator & for cyklus

Reflexe. Aplikační programování v Javě (BI-APJ) - 8 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

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

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

public class Karel { private int position; public boolean issmiling; public int getposition() { return position;

KMI / TMA Tvorba mobilních aplikací. 2. seminář ZS 2016/2017 Středa 13:15-15:45

Transkript:

JAVA Moduly

Modularizace modul explicitně definované co poskytuje i co požaduje proč koncept classpath je křehký chybí zapouzření 2

3

Modulární aplikace motivace proč aplikace více a více komplexní skládání aplikací vývoj v distribuovaných týmech komplexní závislosti dobrá architektura programu ví o svých závislostech spravuje závislosti 4

Modulární aplikace motivace Verze 1.0 vše dobře navrženo 5

Modulární aplikace motivace Verze 1.1...několik vynálezavých hacků...vyčistíme to ve 2.0 6

Modulární aplikace motivace Verze 2.0...oops...ale...funguje to! 7

Modulární aplikace motivace Verze 3.0 Pomoc! Oprava jakékoliv chyby přinese dvě další chyby! 8

Modulární aplikace motivace Verze 4.0 vše dobře navrženo. Kompletně přepsano, trvalo to o rok delé, ale funguje to... 9

Modulární aplikace motivace Version 4.1...tohle vypadá povědomě... 10

Deklarace modulu module-info.java module com.foo.bar { requires com.foo.baz; exports com.foo.bar.alpha; exports com.foo.bar.beta; } modular artifact modularní JAR JAR obsahující module-info.class nový formát JMOD ZIP s třídami, nativním kódem, konfigurací,... 11

Moduly a JDK standardní knihovna JDK také modularní java.base vždy required 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;... 12

Module readability & module path Pokud modul přímo závisí na jiném modulu Modul čte (reads) jiný modul (nebo, jinak, druhý modul je čitelný (readable) prvním modulem) Module path ekvivalent ke classpath ale pro moduly -p, --module-path spuštění aplikace java -p <module_path> name_of_module/name_of_class 13

Module graph module com.foo.app { requires com.foo.bar; requires java.sql; } 14

Dostupnost (Accessibility) Pokud jsou dva typy S a T definovány v různých modulech a T je public, potom kód v S může přistupovat (access) k T pokud: modul s S čte modul s T, a zárověň modul s T exportuje balíček s T 15

Implied readability Readability není tranzitivní příklad: in java.sql java.sql.driver { java.util.logger getparrentlogger();... in java.logging module java.sql { requires public java.logging; requires public java.xml; exports java.sql; exports javax.sql; exports javax.transaction.xa; } 16

Services & ServiceLoader module com.mysql.jdbc { requires java.sql; requires org.slf4j; exports com.mysql.jdbc; provides java.sql.driver with com.mysql.jdbc.driver; } module java.sql { requires public java.logging; requires public java.xml; exports java.sql; exports javax.sql; exports javax.transaction.xa; uses java.sql.driver; } 17

Qualified exports module java.base {... exports sun.reflect to java.corba, java.logging, java.sql, java.sql.rowset, jdk.scripting.nashorn; } není určeno pro běžné používání 18

requires static vyžadován během překlady, ale volitelný při spuštění module com.foo.bar { requires static com.foo.baz; } VAROVÁNÍ kód vyžadující balíček přes required static musí být připraven na nedostupnost 19

opens, open před Java 9, cokoliv je dostupné přes reflection i privátní elementy v Java 9+, i reflexe dodržuje pravidla pro moduly ale balíčky lze otevřít module com.foo.bar { opens com.foo.bar.alpha; } typy v otevřeném balíčku jsou dostupné při běhu open module com.foo.bar { } otevírá všechny svoje balíčky 20

opens to opens package to list-of-modules otevírá balíček jen pro vybrané moduly 21

Reflection package java.lang.reflect; public final class Module { public String getname(); public ModuleDescriptor getdescriptor(); public ClassLoader getclassloader(); public boolean canread(module source); public boolean isexported(string packagename);... } 22

Vrstva (layer) layer instance grafu modulů při běhu programu mapuje každý modul v grafu na jedinečný classloader vrstvy lze vrstvit přes sebe nová vrstva může být vytvořena nad existující graf modulů vrstvy obsahuje (jako reference) grafy modulů všech vrstev níže boot layer vytvořen VM při startu vrstvy určeny pro aplikační servery, IDE,... 23

Kompatibilita se starou Javou Classpath stále podporováno v podstatě jsou moduly volitelné Nepojmenovaný modul cokoliv mimo jakýkoliv modul starý kód čte jakýkoliv jiný modul exportuje všechny svoje balíčky pro všechny jiné moduly 24

Automatic module implicitně definovaný pojmenovaný module nemá deklaraci modulu obyčejný JAR umístěný na module path místo na classpath JAR bez module-info.java 25

JAVA Scripting API

Přehled podpora skriptovacích jazyku přímo z Javy integrace skriptů do Java programu volání skriptů používání Java objektů ze skriptu a obraceně od Java 6 přímo součástí JDK součástí JDK je JavaScript engine Java 6-7 Mozilla Rhino engine Java 8 Nashorn engine implementace JavaScript jazyka v Javě od Java 11 Nashor označen deprecated bude odstraněn bez náhrady ale Scripting API zůstává existuje mnoho implementací pro další jazyky použití přes ServiceLoader

Proč jednotné rozhraní pro všechny skriptovací jazyky dříve si každá implementace řešila rozhraní po svém snadné požívání skr. jazyků proměnné bez typů automatické konverze programy není nutno kompilovat existence shelů použití složitější konfigurační soubory rozhraní pro administrátora aplikace rozšiřování aplikace (pluginy) skriptování v aplikaci obdoba jako JS v prohlížeči, VBScript v office,...

Použití balíček javax.scripting ScriptEngineManager základní třída nalezení a získání instance skript. enginu základní použití instance ScriptEngineManageru nalezení požadovaného enginu spuštění skriptu pomocí metody eval()

Hello world public class Hello { public static void main(string[] args) { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getenginebyname("javascript"); //ScriptEngine engine = manager.getenginebyextension("js"); //ScriptEngine engine = manager.getenginebymimetype("application/javascript"); try { engine.eval("println( \"Hello World!\");" ); System.out.println( engine.eval( " 'Hello World again!' ")); } catch(scriptexception e) {... } } }

Přehled funkčnosti skript řetězec nebo znakový stream (reader) vyhodnocení přes ScriptEngine.eval() interface Compilable jeho implementace volitelná otestovat instanceof Compilable kompilace skriptu do byte-code interface Invocable jeho implementace volitelná otestovat instanceof Invocable volání metod a funkcí ze skriptů Bindings, ScriptContext prostředí pro vykonávání skriptů mapování proměnných sdílených mezi Javou a skriptem

Získání enginu (1) ScriptEngineManager.getEngineFactories() seznam všech ScriptEngineFactory for (ScriptEngineFactory factory : enginemanager.getenginefactories()) { System.out.println("Engine name: " + factory.getenginename()); System.out.println("Engine version: " + factory.getengineversion()); System.out.println("Language name: " + factory.getlanguagename()); System.out.println("Language version: " + factory.getlanguageversion()); System.out.println("Engine names:"); for (String name : factory.getnames()) { System.out.println(" " + name); } System.out.println("Engine MIME-types:"); for (String mime : factory.getmimetypes()) { System.out.println(" " + mime); } }

Získání enginu (2) ScriptEngineFactory.getEngine() nebo přímo ScriptEngineManager.getEngineByName() ScriptEngineManager.getEngineByExtension() ScriptEngineManager.getEngineByMimeType()

Skripty vykonání skriptu Object ScriptEngine.eval( String s,... Object ScriptEngine.eval( Reader r, předávání proměnných (základní varianta) void ScriptEngine.put(String name, Object value) Object ScriptEngine.get(String name) POZOR na konverze typů!

Předávání proměnných interface Bindings extends Map<String,Object> základní implementace SimpleBindings interface ScriptContext prostředí, ve kterém se skripty vykonávají základní implementace SimpleScriptContext obsahuje scopes scope = Binding speciální scopes ENGINE_SCOPE lokální pro ScriptEngine GLOBAL_SCOPE globální pro EngineManager getattribute(..) / setattribute(..) odpovídají getbindings(..).get / put lze nastavit standardní Reader a Writery (vstup a výstup) pro skript

Předávání proměnných zdroj obrázku: http://www.javaworld.com/javaworld/jw-04-2006/jw-0424-scripting.html

Volání funkcí/metod interface Invocable volitelná funkčnost, je třeba testovat (instanceof) poskytuje volání funkcí skriptu z Java kódu volání metod objektů skriptu z Java kódu, pokud je skriptovací jazyk objektový implementace Java interface funkcemi (metodami) skriptu ScriptEngine engine = manager.getenginebyname("javascript"); Invocable inv = (Invocable) engine; engine.eval("function run() { println( 'funkce run'); };"); Runnable r = inv.getinterface(runnable.class); (new Thread(r)).start(); engine.eval("var runobj = { run: function() { println('metoda run'); } };"); o = engine.get("runobj"); r = inv.getinterface(o, Runnable.class); (new Thread(r)).start();

JavaScript engine v JDK (1) některé funkce odstraněny (nebo nahrazeny) převážně z důvodů bezpečnosti vestavěné funkce pro import Java balíčků importpackage(), importclass() balíčky přístupné přes Packages.JmenoBalíčku, pro nejpoužívanější balíčky jsou definované zkratky (proměnné): java (ekvivalentní Packages.java), org, com,.. java.lang není importován automaticky (možné konflikty objektů Object, Math,..) od Java 8 nutno nejdříve použít load("nashorn:mozilla_compat.js"); objekt JavaImporter pro ukrytí importovaných prvků do proměnné (předchází konfliktům) var imp = new JavaImporter( java.lang, java.io);

JavaScript engine v JDK (2) Java objekty v js vytváří se stejně jako v Javě var obj = new Trida(...) Javovské pole v js vytvoříme přes Java Reflection var pole = java.lang.reflect.array.newinstance(..) dále pracujeme běžně: pole[i], pole.length, var a = java.lang.reflect.array.newinstance( java.lang.string, 5); a[0] = "Hello" anonymní třídy anonymní implementace Java rozhraní var r = new java.lang.runnable() { run: function() { println( "running..."); } }; var th = null; th = new java.lang.thread( r); Java, letní semestr th.start(); 2019

JavaScript engine v JDK (3) anonymní třídy (pokrač.) autokonverze funkce na rozhraní s jednou metodou function func() { print("i am func!"); }; th = new java.lang.thread( func); th.start();

JavaScript engine v JDK (4) přetížené Java metody připomenutí overoading se děje při překladu (javac) při předání JavaScriptových proměnných Java metodám vybere script engine správnou variantu výběr můžeme ale ovlivnit objekt[ název_metody(typy parametrů) ](parametry) pozor! řetězec bez mezer!

Další enginy existuje velké množství hotových enginů awk, Haskell, Python, Scheme, XPath, XSLT, PHP,... vytvoření vlastního enginu implementace API nutno implementovat alespoň ScriptEngineFactory ScriptEngine deklarace implementování javax.script.scriptenginefactory pro ServiceLoader