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

Podobné dokumenty
JAVA. Reflection API

Reflexe RTTI Runtime Type Identification

Reflexe_03. Používání dynamického proxy

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

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

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

typová konverze typová inference

Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object.

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

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

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

Bakalářská práce Doplnění mockup komponent pro simulační testování

Úvod. Často jsme nuceni řešit problémy, které by reflexe řešila jasněji, stabilněji a přehledněji. Změny v požadavcích na programové vybavení

Úvod do programovacích jazyků (Java)

Teoretické minimum z PJV

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

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

Programování v jazyce JavaScript

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

RMI Remote Method Invocation

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

Java Enum Java, zimní semestr ,2017 1

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

UJO Framework. revoluční architektura beans. verze

Seminář Java IV p.1/38

Generické programování

Quo vadis programování? Automatizace vyhodnocování studentských úloh

Principy objektově orientovaného programování

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

Výčtový typ strana 67

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

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

Abstraktní třída a rozhraní

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

10 Generické implementace

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

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

Objektově orientované programování v PHP 5. Martin Klíma

Objektově orientované programování

Abstraktní datové typy: zásobník

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

Reflexe_02. Přístup k datovým atributům třídy pomocí reflexe

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

Java Výjimky Java, zimní semestr

Java efektivně. Lukáš Zapletal liberix.cz. Pokročilejší techniky programování v Javě

Kód, který se nebude často měnit

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

3. Třídy. Základní pojmy objektového programování. Třídy

Úvod - problém. Při přidání nového modelu je nutné upravit. Kód, který se nebu de často měnit. n Mějme obchod s auty:

Dědění, polymorfismus

SOUBORY, VSTUPY A VÝSTUPY POKRAČOVÁNÍ

Virtuální metody - polymorfizmus

Úvod do programovacích jazyků (Java)

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

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2009 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 25

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

Soubor jako posloupnost bytů

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.

Základy Guice Vazby Scopes. Google Guice. základní seznámení s frameworkem Google Guice

Abstraktní třídy, polymorfní struktury

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

Programování v jazyku Java hierarchie tříd, přetypování, výjimky

Seminář Java II p.1/43

Mělká a hluboká kopie

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

Katedra měřicí a řídicí techniky, VŠB - Technická univerzita v Ostravě, tř. 17. listopadu, Ostrava-Poruba, Česká republika

Výjimky. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

29. Výjimky, jejich vznik, vyhození, odchyt a zpracování. (A7B36PVJ)

Více o konstruktorech a destruktorech

JAVA V RMI Java, letní semestr

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.

Obsah Znovupou ˇzitelnost N avrhov e vzory Z asady programov an ı Radek Koˇc ı Semin aˇr Java N avrhov e vzory, Z asady... 2/ 46

Základy objektové orientace I. Únor 2010

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2008 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 24

RMI - Distribuované objekty v Javě

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

Java Řetězce Java, zimní semestr

Remote Method Invocation RMI

JAVA RMI Java, letní semestr 2018

9. Polymorfismus a rozhraní

Programování II. Návrh programu I 2018/19

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

KTE / ZPE Informační technologie

Komponenty v.net. Obsah přednášky

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

Java. Generické typy

Výjimky. Tomáš Pitner, upravil Marek Šabo

Java Managenent Extension JMX

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

Programování v jazyce JavaScript

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

Návrhové vzory Tvorba objektů

Testy z Javy verze 1.0 Stránka 1 z 13

Obsah přednášky. dědičnost modifikátory (specifikátory) přístupu

Algoritmizace a programování

Typický prvek kolekce pro české řazení

JAVA. Krátce o Reflection API

4IT101 otázky k závěrečnému testu verze pro zimní semestr 2007/2008

Programování v C++ 3, 3. cvičení

Třídy a dědičnost. A0B36PR1-Programování 1 Fakulta elektrotechnická České vysoké učení technické

Transkript:

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 Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

Úvod Reflexe (také introspekce) je schopnost programu získat informace o vlastní struktuře. Programové konstrukce jsou v reflexi reprezetovány objekty tříd (balík java.lang.reflection): Method, Constructor, Field, Annotation, atd. Reflexe umožňuje programovat v Javě speciální úlohy. Např. interpret skriptového jazyka, který má přístup k JRE.

Reflexní metody třídy Class Metody pro získání metod třídy: veřejné včetně zděděných: Method getmethod(string name, Class<?>... parametertypes) throws NoSuchMethodException, SecurityException všechny veřejné metody včetně zděděných: Method[] getmethods() throws SecurityException všechny s výjimkou zděděných: Method[] getdeclaredmethods() throws SecurityException Obdobné metody jsou k dispozici pro ostatní prvky tříd: položky (Field), konstruktory (Constructor), anotace (Annotation) atd.

Třídy Field, Method, Constructor Třídy reflexní objektů (Field, Method, Constructor) jsou následníky třídy AccesibleObject, která definuje metodu: Annotation[] getannotations() Jednotlivé reflexní třídy pak mají metody umožňující: Field - čtení a nastavování položek, Method - volání metod: Object invoke(object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException Constructor - vytváření instancí: T newinstance(object... initargs) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException

Dynamická proxy třída Dynamická proxy třída (zkráceně proxy třída) je mechanismus, který umožňuje vytvářet třídy dynamicky tedy v runtimu: proxy třídy implementují zadané rozhraní, od proxy tříd lze instancionovat objekty. Pro vytvoření proxy třídy slouží statická metoda Proxy. getproxyclass. Parametrem metody je pole rozhraní, která mají být implemetována: static Class<?> getproxyclass( ClassLoader loader, Class<?>... interfaces) throws IllegalArgumentException Instanci proxy třídy lze pak vytvořit standardně metodou newinstance z třídy Constructor.

Použití metody getproxyclass Příklad: InvocationHandler handler = new MyInvocationHandler(...); Class proxyclass = Proxy.getProxyClass( Foo.class.getClassLoader(), new Class[] { Foo.class }); Foo f = (Foo) proxyclass. getconstructor( new Class[] { InvocationHandler.class }). newinstance(new Object[] { handler }); Rozhraní InvocationHandler obsahuje metodu, která definuje vlastní chování proxy třídy, pokud je volána nějaká metoda implementovaného rozhraní: Object invoke(object proxy, Method method, Object[] args) throws Throwable

Vlastnosti proxy třídy Proxy třída: je podtřídou java.lang.reflect.proxy, je public, final, má jeden konstruktor, jehož parametrem je rozhraní InvocationHandler, implementuje rozhraní zadaná při jejím vytvoření, tj. reflexní metody getinterfaces a getmethods se chovají, jakoby byla proxy třída deklarována s klauzulí extends.

Vlastnosti instancí proxy třídy Pro instance proxy třídy implementující rozhraní Foo platí podmínka: proxy instanceof Foo a je tedy možno provádět přetypování: (Foo) proxy Každá instance má při konstrukci přiřazen objekt handleru volání (InvocationHandler). Volání metody z rozhraní Foo bude delegováno na metodu invoke z invokačního handleru. Stejně je zpracováno volání metod hashcode, equals, a tostring deklarovaných ve třídě Object. Ostatní metody nejsou proxy delegovány takže se chovají implicitním způsobem.

Metoda newproxyinstance Metoda umožňující přímé vytvoření instance proxy třídy: static Object newproxyinstance( ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException Příklad: InvocationHandler handler = new MyInvocationHandler(...); Foo f = (Foo) Proxy.newProxyInstance( Foo.class.getClassLoader(), new Class[] { Foo.class }, handler);