Önelemzés és a JavaBean komponensmodell

Hasonló dokumentumok
S02-3 Multiparadigma programozás és Haladó Java 2

Java Reflection. Reflexió a Java nyelvben

Programozási nyelvek Java

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Programozási nyelvek Java

Programozási nyelvek Java

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Programozási nyelvek Java

JAVA PROGRAMOZÁS 3.ELŐADÁS

A Java és a C++ összehasonlítása

Osztályok. 4. gyakorlat

OOP: Java 8.Gy: Abstract osztályok, interfészek

JAVA PROGRAMOZÁS 2.ELŐADÁS

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Szoftvertechnológia alapjai Java előadások

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Java programozási nyelv 5. rész Osztályok III.

Objektumelvű programozás

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Java programozási nyelv 4. rész Osztályok II.

JavaBeans. Java tutorial. Komponens-elvu programoza s. Off-the-shelf. Megoldas Java modra. O sszeszerele s

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Java programozási nyelv 6. rész Java a gyakorlatban

Abstract osztályok és interface-ek. 7-dik gyakorlat

Segédanyag: Java alkalmazások gyakorlat

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Programozás I. 1. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Programozási nyelvek II.: JAVA

Újdonságok a Java nyelvben

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Mi a különbség az extends és az implements között. Mikor melyiket kell használni? Comperable-t megvalósító oasztályokban össze lehet hasonlitani

Java V. Osztályszint. lyszintű ű tagok. Példányváltozó. Osztályváltozó. Általános Informatikai Tanszék Utolsó módosítás:

Interfészek. PPT 2007/2008 tavasz.

Segédanyag: Java alkalmazások gyakorlat

Már megismert fogalmak áttekintése

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

JNDI - alapok. Java Naming and Directory Interface

Objektumorientált programozás C# nyelven

Java VII. Polimorfizmus a Java nyelvben

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Generikus osztályok, gyűjtemények és algoritmusok

Magas szintű programozási nyelvek 2 Előadás jegyzet

Java VII. Polimorfizmus a Java nyelvben

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 2.ELŐADÁS. Objektumorientált programozás

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Java. Perzisztencia. ANTAL Margit. Java Persistence API. Object Relational Mapping. Perzisztencia. Entity components. ANTAL Margit.

Programozási nyelvek JAVA EA+GY 1. gyakolat

OOP #14 (referencia-elv)

OOP és UML Áttekintés

Programozási nyelvek Java

Osztálytervezés és implementációs ajánlások

Osztálytervezés és implementációs ajánlások

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

Segédanyag: Java alkalmazások gyakorlat

Web-technológia PHP-vel

Programozási technológia

Java III. I I. Osztálydefiníció (Bevezetés)

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Java III. I I. Osztálydefiníció (Bevezetés)

Programozási nyelv Java

Programozás I. 5. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Collections. Összetett adatstruktúrák

Programozási nyelvek II.: JAVA

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás


Programozás I. Első ZH segédlet

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

A Java programozási nyelv

C#, OOP. Osztályok tervezése C#-ban

Kivételkezelés, naplózás. Exception handling, logging

Programozási technológia I.

Generikus Típusok, Kollekciók

Programozási nyelvek Java

Java programozási nyelv

III. OOP (objektumok, osztályok)

Programozási nyelvek II.: JAVA

OOP: Java 8.Gy: Gyakorlás

OOP: Java 4.Gy: Java osztályok

Java és web programozás

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

C# versus Java. Óbudai Egyetem, Java Standard Edition Mérnök Informatikus szak, BSc Labor 3. Bedők Dávid v0.4

Programozási nyelvek Java

Bevezetés a Python programozási nyelvbe

C# osztályok. Krizsán Zoltán

Bevezetés a Java programozási nyelvbe

Java I. A Java programozási nyelv

BME MOGI Gépészeti informatika 8.

Programozási nyelvek II.: JAVA

ELTE SAP EXCELLENCE CENTER Oktatóanyag. Sas László: ABAP Objects Objektumorientált ABAP

Átírás:

Kozsik Tamás kto@elte.hu http://kto.web.elte.hu/ Eötvös Loránd Tudományegyetem Programozási Nyelvek és Fordítóprogramok Tanszék 2008.

Önelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk Sok nyelvben: akár kiegészíthetjük, módosíthatjuk

Dinamikus kötés Dynamic/late binding, dynamic lookup/dispatching Az OOP egyik alapgondolata Futási időben választjuk ki a végrehajtandó kódot Felüldefiniált műveletek közül Öröklődés mentén Nagyfokú rugalmasság, továbbfejleszthetőség, adaptálhatóság, újrafelhasználhatóság Ez nem önelemzés

Önelemzés Javában Egy típusleíró (.class) fájl információi alapján (JVM bájtkód) osztályok interfészek annotációk felsorolási típusok tömbök nem! primitív típusok nem! SDK eszközökkel elemezhető (pl. javap) Futás közben: API van hozzá java.lang.reflect

Példa import java.lang.reflect.*; class Example { public static void main(string[] args) throws Exception { Class c = Class.forName(args[0]); Class[] formalargs = (args.length > 2)? new Class[] {String.class} : new Class[] {}; Object o = c.newinstance(); Method m = c.getmethod(args[1],formalargs); Object[] actualargs = (args.length > 2)? new Object[] {args[2]} : new Object[] {}; System.out.println( m.invoke(o,actualargs) ); } }

Típusok a JVM-ben Beépített típusok Primitív típusok Tömb típusok Betöltött típusok Osztálybetöltés, bájtkód-ellenőrzés, dinamikus szerkesztés Belső reprezentáció: java.lang.class<t> objektumai Tükrözés reflection Koncepcionálisan statikus tagok statikus metódusok szinkronizációja Dinamikus típus lekérdezése public final Class<?> Object.getClass() instanceof dinamikus kötés Önelemzés

Class objektumok Az önelemzés első lépése Minden típushoz tartozik Primitív típusokhoz Referencia típusokhoz Tömbökhöz Fájlból betöltött típusokhoz: Egyéb (absztrakt és konkrét) osztályok Interfészek Felsorolási típusok Annotáció típusok Nem-típushoz: void Többféleképpen is szert lehet tenni rájuk

getclass Ha van egy objektumunk public final Class<?> Object.getClass() Például: "Hello".getClass() String System.out.getClass() java.io.printstream Legyen enum E {A,B,C,D}. Ekkor: A.getClass() E (new byte[1024]).getclass() byte[] (new HashSet<String>()).getClass() HashSet Serializable s = new Vector();... s.getclass()... Vector

.class Nem kell objektum:.class Például String.class java.util.list.class Class.class int.class double[][].class void.class A forráskódban benne van, a fordításhoz kell a típus

Csomagolóosztályok segítségével Primitív típusokhoz java.lang.double.type java.lang.boolean.type... java.lang.void.type

forname Típusbetöltés paraméterezhetően, teljesen dinamikusan public static Class<?> Class.forName(String) Például: Class c = Class.forName(args[0]); Fordításhoz nem kell a típus Futtatáskor a classpath-ban kell lennie Megadható típusnév: Class.forName("java.util.List") szignatúra: Class.forName("[Ljava.lang.String")

Betöltés során adódó hibák Ha nem található a classpath alapján a class fájl java.lang.classnotfoundexception Szerkesztési hibák java.lang.linkageerror

Generikus Class A Java 5-től kezdve a Class osztály generikus Az String típus típusleíró objektuma például Class<String> típusú Csak fordítás során létezik a típusparaméter Típushelyettesítő public final Class<?> Object.getClass() public static Class<?> Class.forName(String)

Metódusok, amelyek Class-t adnak Class.getSuperclass() Class.getInterfaces() Class.getClasses() Class.getDeclaredClasses() getdeclaringclass() Class java.lang.reflect.field java.lang.reflect.method java.lang.reflect.constructor Class.getEnclosingClass() Class.getComponentType()

Egy Class tulajdonságai Módosítók public, protected, private abstract static final strictfp annotációk Típusparaméterek Szülőosztály, kiterjesztett interfészek, generikus változatok Deklaráló/befoglaló Class/metódus/konstruktor Csomag Tömb esetén: komponens típus Konstruktorok Tagok

Módosítók lekérdezése Az annotációk erre a célra való műveletekkel A nem-annotáció módosítószók maszkolással Minden módosítónak megfelel egy int konstans Lekérdezés int public int getmodifiers() Az int-ből maszkolás Egyszerűbben: speciális műveletekkel, pl. public static boolean isstatic(int mod)

Publikusság Publikus információk getmethods(), getfields(),... Örököltek is Minden információ getdeclaredmethods(), getdeclaredfields(),... Örököltek nem

Listázás és kikeresés Bizonyos információk alapján kikeres getmethod(string,class<?>...) getfield(string) stb. Kilistázza az összeset getmethods() getfields() stb.

Objektumok létrehozása Class.newInstance Csak paraméter nélküli konstruktoron keresztül megy A kivételellenőrzési mechanizmusnak keresztbevág (propagálja a kivételeket) Probléma a hozzáféréssel Constructor.newInstance Újabb lehetőség Paraméterezhető nem csak paraméter nélküli konstruktort lehet így hívni A kivételeket csomagolja (InvocationTargetException) AccessibleObject alapon kérhető privát hozzáférés

Mit lehet még csinálni a Class segítségével? típuskényszerítés: public T cast(object obj) dinamikus típusellenőrzés: public boolean isinstance(object obj) lekérdezések (isarray(), isprimitive(), islocalclass) név, egyszerű név kanonikus név osztálybetöltő

Típusok megadása szövegesen Primitív típusok és void mint a kulcsszavak Referenciatípusok tömbök: kódolva (Z,C,B,S,I,J,F,D,L) [I [[C [Ljava.lang.String; egyebek: minősített teljes névvel

Tagok és konstruktorok java.lang.reflect.member interfész java.lang.reflect.field java.lang.reflect.method java.lang.reflect.constructor A Class-ból kiindulva megszerezhetők

Attribútumok Fajtái Példányattribútum Osztályszintű attribútum Felsorolási típus típusértéke Alkotóelemei Név Típus Módosítók, annotációk Szintetizált attribútumok

Érték lekérdezése és beállítása Object get(object) boolean getboolean(object)... void set(object, Object) void setboolean(object, boolean)...

Példa import java.lang.reflect.*; class Point { public int x, y; } class SetField { public static void main( String[] args ) throws Exception { Class<Point> c = Point.class; Object o = c.newinstance(); Field x = c.getfield("x"); x.setint(o,12); Point p = c.cast(o); System.out.println(p.x); } }

Auto-(un)boxing Csak fordításkor Önelemzés során nem történik meg Ha Integer lenne Point.x típusa, az előző példa kivételt váltana ki (IllegalArgumentException) Kompatibilitásvizsgálat Integer.class.isAssignableFrom(int.class) == false int.class.isassignablefrom(integer.class) == false

Metódusok Lekérdezhetők Végrehajthatók Példánymetódusok objektumon Statikus metódusok null-on Alkotóelemeik Módosítók, annotációk Kiváltható kivételek Paramétertípusok Visszatérési érték típusa Típusparaméterek (ha sablon) Alapértelmezett érték (ha annotációelem) Tulajdonságok isbridge() issynthetic() isvarargs()

Típustörlés import java.lang.reflect.method; public class Trouble<T> { } public void lookup(t t) {} public void find(integer i) {} public static void main(string... args) throws Exception { Trouble<?> obj = new Trouble<Integer>(); Class<?> c = obj.getclass(); String mname = args[0]; Class carg = Class.forName(args[1]); Method m = c.getmethod(mname, carg); System.out.println(m.toGenericString()); }

Konstruktorok Lekérdezhetők Példányosításhoz használhatók Alkotóelemeik Módosítók, annotációk Kiváltható kivételek Paramétertípusok Típusparaméterek (ha sablon) Tulajdonságok issynthetic() isvarargs()

Tömbök Class.isArray(), Class.getComponentType() java.lang.reflect.array osztály newinstance(class<?>,int...) getlength(object) get(object,int), getboolean(object,int),... set(object,int,object), setboolean(object,int,boolean),...

Felsorolási típusok Ugyanúgy, mint az osztályok Típusértékek: attribútumok Vonatkozó műveletek Class.isEnum() Class.getEnumConstants(), java.lang.reflect.field.isenumconstant()

Önelemzés tulajdonságai Pozitívum Rugalmasság Újrafelhasználhatóság Továbbfejleszthetőség, adaptálhatóság Negatívum Költséges (végrehajtási idő) Futási idejű hibák nem talál valamit nincs joga valamihez (security manager) Biztonsági problémák privát tagokhoz hozzáférés

Mire használjuk Előre nem ismert kódot manipuláló kód írásánál Keretrendszerek JavaBeans Enterprise JavaBeans Vizuális szerkesztők Nyomkövetők, log-rendszerek, profilozók Dinamikus kódtranszformáció Generatív programozás Kóddal paraméterezhető kód

JDBC-s példa Adatbázist használó program Az adatbáziskezelő lelkét ismerő komponens Függetlenek egymástól JDBC-driver betöltése a kódba Class.forName(args[0]); JDBC-driver nevének átadása $ javac MyApp.java $ java MyApp com.mysql.jdbc.driver

JavaBeans Programozási konvencióknak megfelelő osztályok setter/getter alapján property -k tulajdonságszerkesztők, -konfigurálók eseményvezérelt viselkedés, figyelők (listener) Grafikus felület, szerializálhatóság Vizuális szerkesztőkben JSP

Osztálybetöltő A dinamikus szerkesztés első lépése a betöltés Egy virtuális gépben több betöltő is lehet Konfigurálhatók, programozhatók Egy betöltött kód tulajdonságai függnek a használt betöltőtől (pl. security)