Reflexe RTTI Runtime Type Identification



Podobné dokumenty
JAVA. Reflection API

Pokročilé programování na platformě Java. Ú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

JAVA. Krátce o Reflection API

Platformy NetBean a Eclipse. Úvod

Platformy NetBean a Eclipse. Úvod

Teoretické minimum z PJV

Principy objektově orientovaného programování

Programování v Javě I. Leden 2008

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

PREPROCESOR POKRAČOVÁNÍ

11. Dědičnost. Dědičnost strana 103

Úvod do programovacích jazyků (Java)

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

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

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

RMI Remote Method Invocation

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

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

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

Generické programování

Přehled probírané látky

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

20. Projekt Domácí mediotéka

Abstraktní třída a rozhraní

UJO Framework. revoluční architektura beans. verze

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

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

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

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

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

Java. Generické typy

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

Výčtový typ strana 67

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

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

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

Objektově orientované programování

Struktura třídy, operátory, jednoduché algoritmy, junit. Programování II 2. cvičení Alena Buchalcevová

Jazyk C# (seminář 6)

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

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

Seminář Java II p.1/43

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

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

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

knihovna programátora

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

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

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

Metodika. Architecture First. Rudolf Pecinovský

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

Jazyk C# (seminář 3)

SW_06. Reflexe (reflection)

Abstraktní datové typy: zásobník

Objektově orientované programování 1 XOBO1. Autor: Doc. Ing. František Huňka, CSc.

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

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

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

Čipové karty Lekařská informatika

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/

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

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

Java Enum Java, zimní semestr ,2017 1

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

Copyright Rudolf Pecinovský, Soubor: 02_Rozhraní x Interfejs.doc, verze , uloženo čt :44 1z 55. Rozhraní. interface (interfejs)

Obrázek 6.14: Prohlížec nápovedy

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

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

Úvod do programovacích jazyků (Java)

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

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

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

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

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

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

Programovací jazyk Java

Úvod do programování v jazyce Java

přetížení operátorů (o)

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

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

IRAE 07/08 Přednáška č. 1

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

5 Rekurze a zásobník. Rekurzivní volání metody

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

Kolekce ArrayList. Deklarace proměnných. Import. Vytvoření prázdné kolekce. napsal Pajclín

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

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

Seminář Java IV p.1/38

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

Neměnné objekty. Tomáš Pitner, upravil Marek Šabo

Michal Podzimek

Infrastruktura UML. Modelování struktury v UML. Superstruktura UML. Notace objektů. Diagramy objektů

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

JAVA Moduly Java, letní semestr 2018

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Algoritmizace a programování

Transkript:

Vaše jistota na trhu IT Reflexe RTTI Runtime Type Identification Rudolf PECINOVSKÝ rudolf@pecinovsky.cz

Vaše jistota na trhu IT Opakování Shrnutí či téma

Co je to reflexe/rtti Termínem Reflexe označujeme schopnost získat za běhu informace o typu objektu, s nímž program pracuje Tato schopnost je velice potřebná pro vzdálené zpracování, kdy na jeden počítač přicházejí ke zpracování objekty z jiného počítače a zpracovávající počítač musí mít možnost zjistit o těchto objektech potřebné údaje Všechny potřebné informace o každém typu získáme z jeho class-objektu instance třídy java.lang.class Je-li v OOP vše objekt, je objektem o třída či libovolný jiný datový typ Class-objekt můžeme považovat za objekt představující v programu daný datový typ Svůj class-objekt mají nejenom klasické třídy, ale i rozhraní a primitivní typy Class-objekt je vytvářen instancí třídy ClassLoader při zavádění daného typu do paměti

Základní charakteristika Java je schopná získat za běhu programu od objektu kompletní informaci o jeho typu Název typu Druh typu (rozhraní třída výčtový typ) Atributy, konstruktory, metody a vnořené datové typy Anotace S informacemi zjištěnými za běhu se dá pracovat Volat konstruktory (vytvářet instance) a metody Zjišťovat a přiřazovat hodnoty atributů Lze zjistit i informace o nedostupných členech, ale za běžné situace k nim nelze přistupovat

Využití Nutné při vzdáleném zpracování, protože metoda musí umět zjistit, zda obdržela po síti parametr požadovaného typu Na této schopnosti je založená řada aplikací, které za běhu přizpůsobují své chování objektům s nimiž pracují Potřebujete-li přizpůsobit chování programu verzi virtuálního stroje, na kterém program aktuálně běží Jednotlivé verze se poněkud liší svými knihovnami Může nastat případ, kdy neexistuje společná použitelná třída ve všech podporovaných verzích knihoven Chcete-li dosáhnout dynamického chování programu JVM nenabízí (zatím) nic, co by Java přímo neuměla Překladače dynamických jazyků nad JVM (Groovy, Jython, JRuby, ) řeší dynamičnost prostřednictvím reflexe

Získání existujícího class-objektu Literál Typ.class Vrací class-objekt zadaného typu Typ se zapisuje přímo svým názvem, a musí být proto znám již v době překladu (String.class) Takto lze získat i class-objekt primitivních typů (int.class) Metoda instance.getclass() Nepřekrytelná instanční metoda zděděné od třídy Object Vrací class-objekt vlastní rodičovské třídy dané instance Překladač zná pouze deklarovaný typ dané instance, nezná však její skutečný typ, tj. její vlastní rodičovskou třídu

Získání (i) nového class-objektu Statická metoda Class.forName(String) Parametr definuje název typu, jehož class-objekt chceme získat Název typu musí být úplný např. "java.lang.string" Metoda umožňuje zjistit název potřebného typu až za běhu Umožňuje získávat class-objekty typů vytvořených až po spuštění programu Stat. m. Class.forName(String, boolean, ClassLoader) 2. parametr umožní zavést, ale neinicializovat typ se zadaným názvem Zrychlí zavedení typu / vytvoření class-objektu Výhodné, pokud pouze zjišťujeme přítomnost typu, ale nechceme s ním dále pracovat 3. parametr umožní definovat, odkud a jak daný typ získám Zadaný ClassLoader může načítat podklady např. z databáze či bajtového pole Výraz Class.forName("Foo") je ekvivalentní zápisu Class.forName("Foo",true,this.getClass().getClassLoader()) Je-li typ zadaného názvu již zaveden, je vrácen jeho class-objekt (tj. nevytváří se nový)

Třída Class a její metody Vaše jistota na trhu IT

Metody Třída definuje 57 metod, z toho pouze 2 statické (metody forname(???)) ClassLoader getclassloader() Vrátí ClassLoader, který zaváděl danou třídu URL getresource(string name) Vrátí URL zadané relativně vůči umístění třídy Lze použít i uvnitř JAR-souborů, avšak pouze v jedné úrovni InputStream getresourceasstream(string name) Vrátí vstupní proud čtoucí ze souboru zadaného URL relativní vůči umístění třídy Zjištění názvu třídy String getsimplename() String getname() String tostring()

Zjišťování druhu datového typu Class-objekt nereprezentuje pouze třídy, ale i jiné druhy datových typů Získání informací o druhu typu reprezentovaného class-objektem isannotation() isanonymousclass() isarray() isenum() isinterface() islocalclass() ismemberclass() isprimitive() issynthetic()

Další informace o typu Package getpackage() Objekt reprezentující balíček int getmodifiers() Každému modifikátoru je přiřazen bit, přítomnost modifikátoru je reprezentována nahozením bitu Class<? super T> getsuperclass() Získání class-objektu rodičovské třídy Class<?> getcomponenttype() Získání class-objektu prvků pole

Informace o členech daného typu Metody vracející reprezentanty veřejných členů Vrací i zděděné členy Constructor<?>[] getconstructors() Field[] getfields() Method[] getmethods() Class<?>[] getclasses() Annotation[] getannotations() Metody vracející reprezentanty deklarovaných členů Vrací i soukromé členy, ale nevrací zděděné členy Constructor<?>[] getdeclaredconstructors() Field[] getdeclaredfields() Method[] getdeclaredmethods() Class<?>[] getdeclaredclasses() Annotation[] getdeclaredannotations()

Získání konkrétního členu U konstruktorů je třeba zadat typy parametrů Constructor<T> getconstructor(class<?>... parametertypes) Constructor<T> getdeclaredconstructor(class<?>... parametertypes) Statický konstruktor nelze získat, protože by nám stejně k ničemu nebyl U metod je třeba zadat název a typy parametrů Method getmethod(string name, Class<?>... parametertypes) Method getdeclaredmethod(string name, Class<?>... parametertypes) Nelze použít názvy <init> a <clinit> jsou to sice metody, ale musí se volat jako konstruktory, aby se před nimi zavolal new U polí se zadává pouze název Field getfield(string name) Field getdeclaredfield(string name)

Práce se získanými členy Vytvoření instance pomocí konstruktoru T newinstance(object... initargs) V poli předávaném jako parametr se zadávají hodnoty parametrů Metodu newinstance() má i class-objekt a volá implicitní konstruktor => vystačíme-li s implicitním konstruktorem, nepotřebujeme Constructor Zavolání metody Object invoke(object obj, Object... args) V poli předávaném jako parametr se zadávají hodnoty parametrů Parametr obj je this = instance, jejíž metodu voláme (u statických metod se ignoruje může být null) Získání a nastavení hodnoty pole Object get(object obj) Object set(object obj, Object value) Boolean getboolean(object obj) Boolean setboolean(object obj, boolean value)... a další metody pro zbylé primitivní datové typy Zadávaný parametr obj představuje objekt, s jehož polem pracujeme

Soukromé a konstantní členy Třídy Constructor, Method a Field jsou definovány v balíčku java.lang.reflect Všechny jsou potomky třídy java.lang.reflect.accessibleobject Od ní dědí (mimo jiné) metody boolean isaccessible() void setaccessible(boolean flag) Nastavením přístupnosti lze zařídit: Použitelnost soukromých členů Modifikovatelnost konstant (nevztahuje se na konstanty vyhodnotitelné v době překladu)

Přetypování & spol. <U> Class<? extends U> assubclass(class<u> clazz) Přetypuje class-objekt aby reprezentoval svého zadaného potomka T cast(object obj) Přetypuje zadaný objekt na typ reprezentovaný class-objektem boolean isassignablefrom(class<?> cls) Zjistí, lze li do instancí class-objektu přiřazovat instance zadaného typu, tj. lze-li typ class-objektu považovat za rodič zadaného typu boolean isinstance(object obj) Zjistí, je-li zadaný objekt instancí typu class-objektu či jeho potomka

Vlastnosti interních tříd Je interní? boolean islocalclass() boolean ismemberclass() Zjištění definičního bloku lokální třídy Constructor<?> getenclosingconstructor() Method getenclosingmethod() Zjištění vlastníka dané třídy Class<?> getdeclaringclass() Pouze pro globální (vnořené a vnitřní) třídy Class<?> getenclosingclass() I pro lokální třídy

Práce s anotacemi Datové typy mohou být označeny anotacemi kvůli nim třída implementuje rozhraní AnnotatedElement, které deklaruje metody: boolean isannotationpresent (Class<? extends Annotation> annotationclass) <A extends Annotation> A getannotation (Class<A> annotationclass) Annotation[] getannotations() public Annotation[] getdeclaredannotations()

Vaše jistota na trhu IT Děkuji za pozornost Rudolf Pecinovský mail: rudolf@pecinovsky.cz ICQ: 158 156 600