JAVA. Reflection API

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

Reflexe RTTI Runtime Type Identification

JAVA. Krátce o Reflection API

Platformy NetBean a Eclipse. Úvod

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

Platformy NetBean a Eclipse. Úvod

Úvod do programovacích jazyků (Java)

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

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

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

typová konverze typová inference

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

Seminář Java II p.1/43

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

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

Generické programování

Algoritmizace a programování

Java Enum Java, zimní semestr ,2017 1

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

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

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/

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

Abstraktní třída a rozhraní

Swing. Vlastní kreslení

Programování v Javě I. Leden 2008

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

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

RMI Remote Method Invocation

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

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Seminář Java IV p.1/38

Ú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í

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

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

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

PREPROCESOR POKRAČOVÁNÍ

Abstraktní datové typy: zásobník

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

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

Java Výjimky Java, zimní semestr

Výčtový typ strana 67

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

Principy objektově orientovaného programování

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.

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

UJO Framework. revoluční architektura beans. verze

Iterator & for cyklus

JAVA. Java Management Extensions JMX

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

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

Základy jazyka Java. (pro programátory v C++) Josef Pelikán, MFF UK Praha

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

Teoretické minimum z PJV

Úvod do programovacích jazyků (Java)

Remote Method Invocation RMI

Jazyk C# (seminář 6)

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

20. Projekt Domácí mediotéka

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

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

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

Java. Generické typy

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

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

Osnova přednášky. Programové prostředky řízení Úvod do C# II. Přístup ke členům. Členy (Members)

SW_06. Reflexe (reflection)

10 Generické implementace

Jazyk C# (seminář 3)

1. Programování proti rozhraní

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

NA CO SI DÁT POZOR V JAVASCRIPTU? Angular.cz

Více o konstruktorech a destruktorech

RMI - Distribuované objekty v Javě

Čipové karty Lekařská informatika

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

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

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

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

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

Java Řetězce Java, zimní semestr

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

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

Jazyk C# (seminář 3)

Textové soubory. alg9 1

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

Soubor jako posloupnost bytů

DPKOM_06 Dědičnost entit a zpětná volání posluchači

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

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

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

7. Dynamické datové struktury

Zapouzdření. Tomáš Pitner, upravil Marek Šabo

JavaBeans API umožňuje psaní softwarových komponent v programovacím jazyce Java. Komponenta je obecně nějakou částí programového kódu, které je

Java - řazení objektů

Rozhraní SAX, SAX vs. SAX2. Jaroslav Ciml

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

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

17. Projekt Trojúhelníky

Testovací metoda. Testovací metoda. public class SimpleTest {

Transkript:

JAVA Reflection API 1

Přehled Reflection Mění strukturu/stav objektů Introspection Zkoumá strukturu objektů obdoba RTTI v C++ ale mnohem silnější umožňuje 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 2

Přehled nejprve pro <= JDK 1.4 pak změny od JDK 5 3

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í 4

java.lang.class získání instance třídy Class getclass() metoda na třídě Object vrátí třídu objektu, na kterém je zavolána literál class (představuje expression typu Class) JmenoTridy.class třída pro daný typ Class.forName(String classname) 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 5

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 podrobně bude později 6

java.lang.class: metody boolean isprimitive() boolean isarray() boolean isinterface() test, zda třída reprezentuje primitivní typ resp. pole resp. interface boolean isinstance(object o) test, zda daný objekt je instancí třídy ekvivalent k operatoru instanceof boolean isassignablefrom(class cls) test, zda tato třída/interface je stejná nebo nadtřída/nadinterface cls tj. zda objekt typu cls lze přiřadit do proměnné typu třídy, na níž je metoda volaná 7

java.lang.class: metody String getname() vrátí jméno třídy pro primitivní typy vrátí jeho jméno pro pole vrátí řetězec začínající znaky [ (tolik, kolik má pole dimenzí) a pak označení typu elementu Z..boolean, B..byte, C..char, D..double, F..float, I..int, J..long, S..short, Lclassname..třída nebo interface String.class.getName() // vrátí "java.lang.string" byte.class.getname() // vrátí "byte" (new Object[3]).getClass().getName() // vrátí "[Ljava.lang.Object;" (new int[3][4][5][6][7][8][9]).getclass().getname() // vrátí "[[[[[[[I" 8

java.lang.class: metody Package getpackage() vrátí balík, ve kterém je třída definovaná java.lang.package informace o balíku Class getsuperclass() vrátí předka třídy pro třídu Object, primitivní typy a interface vrací null Class[] getinterfaces() vrátí všechny implementované interface pokud třída neimplementuje žádný inteface, vrací pole délky 0 pro primitivní typy vrací také pole délky 0 9

java.lang.class: metody Method[] getmethods() vrátí všechny metody třídy (public) Field[] getfields() vrátí všechny atributy třídy (public) Constructor[] getconstructors() vrátí všechny konstruktory (public) Method[] getdeclaredmethods() Fields[] getdeclaredfields() Constructor[] getdeclaredconstructors() vrátí všechny metody/atributy/konstruktory deklarované ve třídě nevrátí zděděné prvky 10

java.lang.class: metody Field getfield(string name) Field getdeclaredfield(string name) vrátí atribut daného jména Method getmethod(string name, Class[] paramtypes) Method getdeclaredmethod(string name, Class[] paramtypes) vrátí metodu daného jména a daných typů parametrů Constructor getconstructor(class[] paramtypes) Constructor getdeclaredconstructor(class[] paramtypes) vrátí konstruktor s danými typy parametrů 11

java.lang.class: metody Class getdeclaringclass() vrátí třídu nebo interface, ve kterém je třída/interface deklarována pro vnitřní třídy Class[] getclasses() vrátí třídy/interface deklarované ve třídě nebo nadtřídách Class[] getdeclaredclasses() vrátí třídy/interface deklarované ve třídě Class getcomponenttype() vrátí typ elementů pole pokud objekt není pole, vrací null 12

java.lang.class: metody public URL getresource(string name) public InputStream getresourceasstream(string name) načte nějaký zdroj obrázky,..., cokoliv data načítá classloader => načítání se řídí stejnými pravidly jako načítání tříd jméno zdroje ~ hierarchické jméno jako u tříd oddělovací tečky jsou nahrazeny lomítky '/' 13

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 14

Modifikátory int getmodifiers() metoda na java.lang.class vrátí modifikátory zakódované do integeru java.lang.reflect.modifiers dekódování integeru s modifikátory statické metody boolean ispublic(int mod) boolean isstatic(int mod) boolean issynchronized(int mod)... void tostring(int mod) vrátí řetězec s modifikátory v integeru 15

java.lang.reflect.field informace o atributech přístup k atributu metody String getname() jméno atributu Class gettype() typ atributu int getmodifiers() modifikátory Class getdeclaringclass() které třídě atribut patří 16

java.lang.reflect.field získávání hodnoty atributu Object get(object obj) vrátí hodnotu atributu v objektu obj pokud je atribut primitivního typu, pak je hodnota vrácena v odpovídajícím wrapper typu boolean getboolean(object obj) vrátí hodnotu boolean atributu v objektu obj int getint(object obj) vrátí hodnotu int atributu v objektu obj... nastaví hodnoty atributu void set(object obj, Object value) nastaví hodnotu atributu v objektu obj na hodnotu value void setint(object obj, int v) void setboolean(object obj, boolean b)... 17

java.lang.reflect.method String getname() Class getdeclaringclass() int getmodifiers() Class getreturntype() návratový typ metody Class[] getexceptiontypes() pole s typy výjimek, které může metoda vyhodit Class[] getparametertypes pole s typy parametrů v pořadí, v jakém jsou deklarovány 18

java.lang.reflect.method Object invoke(object obj, Object[] params) na objektu obj zavolá metodu params parametry volání metody pokud je metoda bez parametrů, pak params může být null nebo pole délky 0 pořadí parametrů v jakém jsou deklarovány hodnoty primitivních typů jsou v příslušné wrapper třídě vrací návratová hodnotu volání metody hodnoty primitivních typů jsou v příslušné wrapper třídě 19

java.lang.reflect.constructor String getname() Class getdeclaringclass() int getmodifiers() Class[] getexceptiontypes() Class[] getparametertypes() Object newinstance(object[] params) vytvoří novou instanci třídy pro parametry platí vše jako u metody invoke() 20

java.lang.reflect.array statické metody pro přístup k polím Object newinstance(class componenttype, int length) vytvoří jednorozměrné pole Object newinstance(class componenttype, int[] dimensions) vytvoří vícezměrné pole Object get(object array, int index) int getint(object array, int index)... void set(object array, int index, Object val) void setint(object array, int index, int val)... 21

JDK 5 třída Class generický typ Class<T> T newinstance() dříve vracela Object Class <? super T> getsuperclass() dříve vracela Class T cast(object o) nová metoda v JDK 1.4 a níže by neměla význam třída Constructor také generický typ Constructor<T> T newinstance(object... params) 22

JDK 5 podpora pro enum, anotace, proměnný počet parametrů, generické typy nové metody na třídě Class isenum() isannotation() Introspekce probíhá během runtime, proto pozor na type erasure (týka se generických typů) class MethodTrouble<T> { void lookup(t value) {} } Class<?> c = (new MethodTrouble<Integer>()).getClass(); Method m = c.getmethod( lookup, Integer.class); 23

JDK 5 enum boolean Class<T>.isEnum() vrací true, když daná třída reprezentuje enum T[] Class<T>.getEnumConstants() vrací pole konstant enumu. Pokud Class nereprezentuje enum, vrací null 24

JDK 5 - anotace Class implementuje interface AnnotatedElement (ten je implentován taky třídami Field, Method, Package) Annotation[] Class<T>.getAnnotations() vrací všechny anotace Annotation[] Class<T>.getDeclaredAnnotations() vrací všechny anotace, které byly deklarované na dané třídě. Ignoruje zděděné anotace. <T extends Annotation> T getannotation(class<t> annotationtype) vrací anotaci požadovaného typu (např. Override.class) definovanou na dané třídě a nebo null 25

JDK 5 generické typy Class implementuje interface GenericDeclaration: TypeVariable<?>[] gettypeparameters() vrací seznam generických parametrů deklarovaných danou třídou. lze získat upper bound (T extends něco) declaration využívající daný generický parameter pozor lower-bound (T super něco) nelze specifikovat u typů! 26

K čemu je to vše dobré? Pluginy Dynamic loading, instantiation Adaptace rozhraní Zpracování anotací za běhu Viz EJB, Spring, Hibernate Patchování/debugování kodu Přístup k non-public fieldům (viz Field.setAccesible(true)), Runtime code generation Proxies 27

java.lang.reflect.proxy vytváření dynamických proxy tříd třída implementující nějaký daný interface a volá metody na nějakém jiném objektu (typicky s nekompatibilním interfacem) static Object newproxyinstance(classloader loader, Class<?>[] interfaces, InvocationHandler h) interfaces pole interfaců, které má proxy implementovat h objekt zodpovědný za volání metod InvocationHandler interface s jednou metodou Object invoke(object proxy, Method method, Object[] args) 28

java.lang.reflect.proxy příklad InvocationHandler handler = new MyInvocationHandler(...); Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(), new Class[] { Foo.class }, handler); 29

Pluginy příklad interface Plugin { void foo(); } class P1 implements Plugin { public void foo() { } } 30

Pluginy příklad (pokrač.) class Main { private Plugin[] initplugins(string[] namesofpluginsclasses){ ArrayList<Plugin> ps = new ArrayList<>(); Class pluginiface = Plugin.class; for (String name : namesofpluginclasses) { Class cls = Class.forName(name); if (cls.isarray() cls.isinterface() cls.isprimitive()...) { // report error continue; } if (!pluginiface.isassignablefrom(cls)) { //report error continue; } ps.add(cls.newinstance()); } return ps.toarray(new Plugin [ps.size()]); }... 31