Platformy NetBean a Eclipse Úvod
O předmětu Petr Hnětynka hnetynka@d3s.mff.cuni.cz Pavel Parízek parizek@d3s.mff.cuni.cz http://d3s.mff.cuni.cz/~hnetynka/netbeans předpokládá se znalost Javy (alespoň v rozsahu NPRG013, lépe i NPRG021) 0/2 Z
Zápočet napsání zápočtového programu domluvit si zadání do konce výuky v letním semestru poslat mailem téma rozšíření pro NetBeans nebo Eclipse více na dalších slidech odevzdat nejlépe do konce června nejpozději do konce září (než začne nový akademický rok) předvedení osobně plus emailem uživatelskou dokumentaci a zdrojáky
Zápočet NetBeans vlastní (netriviální) program/modul nad NetBeans platform spolu se zápočtem lze získat i osvědčení NetBeans Certified Engineer 3 možnosti open-source vlastní program/modul nad NetBeans platform rozšíření stávajících modulů opravení 5 chyb z NetBeans Bugzilly
Zápočet Eclipse vlastní (netriviální) program/plugin nad Eclipse
Osnova předmětu Úvod OSGi NetBeans Úvod Moduly Okna NB filesystem Datové objekty a uzly Eclipse (1 přednáška) (1 přednáška) (6 přednášek) (6 přednášek) Úvod Eclipse infrastruktura bundle, plugin, SWT, extension UI příkazy a akce, builders, natures help, preferences, cheat sheets features, bundling, branding, update sites, RICH Platformy NetBeans a Eclipse, letní semestr 2014 applications
Literatura, odkazy vše o Javě NetBeans http://www.oracle.com/technetwork/java/ http://netbeans.org/ http://platform.netbeans.org/ http://netbeans.org/features/platform/all-docs.html Eclipse http://eclipse.org/ http://www.eclipse.org/articles/ http://www.vogella.de/eclipse.html
Literatura, odkazy NetBeans Eclipse
O předmětu notebooky s sebou! připojení k internetu s sebou!
NetBeans a Eclipse Proč používat framework...
Proč používat... Let's create our own framework! Maintaining the framework takes a lot of my time :(
Proč používat... Don't reinvent the wheel!
Proč používat... Neobjevovat kolo! Znovupoužití kódu Existující knihovny Modulární aplikace Soustředění se jen na aplikační logiku
Nuance V-Builder VoiceXML
Fiorano Studio: Lego Blocks for SOA
Nokia NetAct: Mobile Network Mgr
TidalWave BlueMarine: Photo Manager
Global Vision Systems EasyMonitoring
IBM Lotus Expeditor
ForeFlight
Java Zopakování různých vlastností
Zopakování různých vlastností Reflection API
Přehled Reflection Introspection zkoumá strukturu objektů umožňuje mění strukturu/stav objektů zjišťování informací o třídách, atributech, metodách vytváření objektů volání metod... balík java.lang.reflect třída java.lang.class 23
java.lang.class instance třídy Class reprezentuje třídu nebo interface v běžícím programu primitivní typy také reprezentovány jako instance třídy Class nemá žádný konstruktor instance vytvářeny automaticky při natažení kódu třídy do JVM třídy jsou natahovány do JVM až při jejich prvním použití 24
java.lang.class získání instance třídy Class getclass() literál class (představuje expression typu Class) JmenoTridy.class třída pro daný typ Class.forName(String classname) metoda na třídě Object vrátí třídu objektu, na kterém je zavolána statická metoda vrátí třídu daného jména pro primitivní typy statický atribut TYPE na wrapper třídách Integer.TYPE literál class int.class 25
java.lang.class třídy do JVM natahuje classloader java.lang.classloader standardní classloader hledá třídy v CLASSPATH lze si napsat vlastní classloader Class.forName(String classname, boolean initialize, ClassLoader cl) natáhne třídu daným classloaderem a vrátí objekt třídy Class getclassloader() metoda na Class classloader, kterým byla třída natažena upozornění: typ objektu je reprezentována nejen pomocí Class, ale také classloaderu, který danou class nahrál 26
java.lang.class: metody String getname() boolean isprimitive() boolean isarray() boolean isinterface() boolean isinstance(object o) boolean isassignablefrom(class cls) test, zda daný objekt je instancí třídy ekvivalent k operatoru instanceof zda objekt typu cls lze přiřadit do proměnné typu třídy, na níž je metoda volaná Method[] getmethods() Field[] getfields() Constructor[] getconstructors()... 27
java.lang.class: instance Object newinstance() vytvoří novou instanci dané třídy použije se konstruktor bez parametrů jako by se použilo new Trida() vytváření nových instancí od třídy pomocí jiných konstruktorů třída java.lang.reflect.constructor 28
Zopakování různých vlastností Classloader
Přehled třídy se do VM natahují dynamicky lze změnit java.lang.classloader VM používá classloadery pro natahovaní tříd každá třída je natažena nějakým classloaderem odkud se natahují jak se natahují Class.getClassLoader() výjimka třídy pro pole vytvářeny automaticky, když je potřeba Class.getClassLoader() vrací stejnou třídu jako pro elementy pole
Třída a classloader třída je ve VM určena nejen jménem ale i classloaderem jedna třída natažená různými classloadery => z pohledu VM dvě různé třídy každý classloader má předka (teď ne dědičnost) výjimka system bootstrap classloader pokud se nespecifikuje => systémový classloader nemá předka při použití null nebude žádný předek při natahování třídy classloader nejdříve deleguje natažení na předka a pokud ten třídu nenalezl, natáhne classloader třídu sám
Třída a classloader pokud jsou při natahování třídy potřeba další třídy, natahují se stejným classloaderem lze si napsat vlastní classloader podědit od java.lang.classloader předefinovat metodu findclass() použití Class.forName("trida", true, new MyClassLoader()); nebo new MyClassLoader().loadClass("trida"); lze zcela změnit systém načítání (ve smyslu předků) není to vhodné
Příklad použití více classloaderů oddělení jmenných prostorů př. aplikační server jedna VM "aplikace" jsou natahovány vlastními classloadery mohou využívat různé verze stejných knihoven (různé třídy se stejnými názvy)
Zopakování různých vlastností Service loader & provides
Přehled mějme nějaký interface pro nějakou službu př. javax.xml.parsers.documentbuilderfactory různí dodavatelé implementace služby pokud bychom chtěli použít v programu, museli bychom jméno implementace mít napevno v kódu při změně dodavatele nutno změnit kód lépe => použijeme ServiceLoader
Použití implementaci zabalit do JAR v kódu přidat do JAR soubor META-INF/services/jmeno.interfacu.služby př: META-INF/services/javax.xml.parsers.DocumentBuilderFactory v něm co řádek, to jméno třídy implementující interface sl = ServiceLoader.load(interface.class, classloader); sl.iterator() ServiceLoader je až od JDK 6 META-INF/services se používá už od JDK 1.3 bylo nutné si obdobu ServiceLoaderu napsat ručně lze použít na dependency injection
Zopakování různých vlastností 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 anotaci lze použít tam, kde lze použít nějaký modifikátor výjimka u anotací pro balíky při definici anotace lze omezit, na co půjde použít lze použít mezi modifikátory v jakémkoliv pořadí zapisují se do spec. souboru package-info.java konvence použít nejdřív anotace a pak modifikátory lze aplikovat libovolné množství anotací na jeden element nelze aplikovat jednu anotaci vícekrát ani při použití různých parametrů
Definice a použití podobně jako interface př. @interface metody bez implementace public @interface RequestForEnhancement { int id(); String synopsis(); String engineer() default "[unassigned]"; String date() default "[unimplemented]"; } @RequestForEnhancement( id = 2868724, synopsis = "Enable time-travel", engineer = "Mr. Peabody", date = "4/1/3007" ) public static void travelthroughtime(date destination) {... }
Definice anotace pro použití na anotacích @Target ovlivňují možnosti použití anotace v balíku java.lang.annotation specifikuje, na jakém elementu lze anotaci použít @Retention specifikuje, kde je anotace použitelná source, class, runtime
Zpracování Reflection API interface AnnotatedElement na runtime anotace Annotation Processing Tool (APT) nástroj pro zpracování source anotací vytváření tzv. annotation processors součást JDK od JDK 8 bude APT a související API označeno za deprecated od JDK 6 lze říct přímo překladači, aby použil anotační procesory parametr -processor
Zopakování různých vlastností MVC a DCI
MVC Model-View-Controler Zdroj obrázku: http://zdrojak.root.cz/clanky/uvod-do-architektury-mvc/
DCI Data-Context-Interactions řeší problém OOP je dobré pro modelování dat kam dát operace? př. bankovní účet a převod peněz
DCI Zdroj obrázků: http://www.artima.com/articles/dci_vision.html
NetBeans a Eclipse Modulární systémy Komponentové systémy
Přehled žádná aplikace se dnes nepíše od začátku knihovny, frameworky,... co když chceme mít aplikaci rozšiřitelnou třetími stranami co když chceme distribuovaný vývoj samotné objekty nestačí potřebujeme komponenty (moduly, pluginy,...) v Java 9 budou moduly přímo obsaženy komponenty mají explicitně i závislosti (požadavky) objekty mají explicitně poskytované služby komponenty naimplementovány pomocí objektů existuje obrovské množství komponentových systémů
Komponenty vs. NetBeans a Eclipse NetBeans moduly Eclipse pluginy základ systému = kontejner pro komponenty poskytuje správu komponent správu závislostí versioning NetBeans vlastní systém Eclipse OSGi od 6.9 NetBeans platforma může běžet nad OSGi NB moduly budou OSGi bundly některé Eclipse pluginy (bez UI) lze použít v NB
Komponenty vs. NetBeans a Eclipse druhy komponent (ve vztahy k NB a Ecl) normální knihovny obálka na existujícími JAR baliky jak NB, tak i Ecl umožňují vytvářet rozšíření do IDE samostatné aplikace vůbec to nemusí být IDE aplikace je sada komponent (plus kontejner)
NetBeans vs. Eclipse hlavní rozdíly (zjednodušeně) komponentový kontejner NB vlastní UI ale lze mít i OSGi Eclipse OSGi NB Swing Eclipse SWT podpora NB Oracle (dříve Sun) Eclipse IBM