36
Önelemzés és a JavaBean komponensmodell Kozsik Tamás [email protected] http://kto.web.elte.hu/ Eötvös Loránd Tudományegyetem Programozási Nyelvek és Fordítóprogramok Tanszék 2008. Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

  • Upload
    others

  • View
    22

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Önelemzés és a JavaBean komponensmodell

Kozsik Tamá[email protected]

http://kto.web.elte.hu/

Eötvös Loránd TudományegyetemProgramozási Nyelvek és Fordítóprogramok Tanszék

2008.

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 2: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Önelemzés

Introspection, reflectionFutás közben vizsgáljuk a kódotAktiválhatjukSok nyelvben: akár kiegészíthetjük, módosíthatjuk

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 3: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Dinamikus kötés

Dynamic/late binding, dynamic lookup/dispatchingAz OOP egyik alapgondolataFutási idoben választjuk ki a végrehajtandó kódotFelüldefiniált muveletek közülÖröklodés menténNagyfokú rugalmasság, továbbfejleszthetoség,adaptálhatóság, újrafelhasználhatóságEz nem önelemzés

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 4: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Önelemzés Javában

Egy típusleíró (.class) fájl információi alapján(JVM bájtkód)

osztályokinterfészekannotációkfelsorolási típusoktömbök nem!primitív típusok nem!

SDK eszközökkel elemezheto (pl. javap)Futás közben: API van hozzájava.lang.reflect

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 5: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

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) );}

}

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 6: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Típusok a JVM-ben

Beépített típusokPrimitív típusokTömb típusok

Betöltött típusokOsztálybetöltés, bájtkód-ellenorzés, dinamikus szerkesztésBelso reprezentáció: java.lang.Class<T> objektumaiTükrözés – reflectionKoncepcionálisan

statikus tagokstatikus metódusok szinkronizációja

Dinamikus típus lekérdezésepublic final Class<?> Object.getClass()

instanceofdinamikus kötés

Önelemzés

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 7: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Class objektumok

Az önelemzés elso lépéseMinden típushoz tartozik

Primitív típusokhozReferencia típusokhoz

TömbökhözFá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

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 8: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

getClass

Ha van egy objektumunkpublic final Class<?> Object.getClass()

Például:"Hello".getClass()→ StringSystem.out.getClass()→ java.io.PrintStreamLegyen enum E {A,B,C,D}. Ekkor:A.getClass()→ E(new byte[1024]).getClass()→ byte[](new HashSet<String>()).getClass()→ HashSetSerializable s = new Vector();... s.getClass() ... → Vector

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 9: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

.class

Nem kell objektum: .class

PéldáulString.classjava.util.List.classClass.classint.classdouble[][].classvoid.class

A forráskódban benne van, a fordításhoz kell a típus

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 10: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Csomagolóosztályok segítségével

Primitív típusokhozjava.lang.Double.TYPE

java.lang.Boolean.TYPE

...java.lang.Void.TYPE

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 11: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

forName

Típusbetöltés paraméterezhetoen, teljesen dinamikusanpublic static Class<?> Class.forName(String)

Például: Class c = Class.forName(args[0]);

Fordításhoz nem kell a típusFuttatáskor a classpath-ban kell lennieMegadható

típusnév: Class.forName("java.util.List")szignatúra: Class.forName("[Ljava.lang.String")

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 12: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Betöltés során adódó hibák

Ha nem található a classpath alapján a class fájljava.lang.ClassNotFoundException

Szerkesztési hibákjava.lang.LinkageError

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 13: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Generikus Class

A Java 5-tol kezdve a Class osztály generikusAz String típus típusleíró objektuma példáulClass<String> típusúCsak fordítás során „létezik” a típusparaméterTípushelyettesítopublic final Class<?> Object.getClass()public static Class<?> Class.forName(String)

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 14: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Metódusok, amelyek Class-t adnak

Class.getSuperclass()

Class.getInterfaces()

Class.getClasses()

Class.getDeclaredClasses()

getDeclaringClass()Classjava.lang.reflect.Fieldjava.lang.reflect.Methodjava.lang.reflect.Constructor

Class.getEnclosingClass()

Class.getComponentType()

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 15: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Egy Class tulajdonságai

Módosítókpublic, protected, privateabstractstaticfinalstrictfpannotációk

TípusparaméterekSzüloosztály, kiterjesztett interfészek,generikus változatokDeklaráló/befoglaló Class/metódus/konstruktorCsomagTömb esetén: komponens típusKonstruktorokTagok

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 16: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Módosítók lekérdezése

Az annotációk erre a célra való muveletekkelA nem-annotáció módosítószók maszkolással

Minden módosítónak megfelel egy int konstansLekérdezés→ intpublic int getModifiers()Az int-bol maszkolásEgyszerubben: speciális muveletekkel, pl.public static boolean isStatic(int mod)

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 17: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Publikusság

Publikus információkgetMethods(), getFields(), ...Örököltek is

Minden információgetDeclaredMethods(), getDeclaredFields(), ...Örököltek nem

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 18: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Listázás és kikeresés

Bizonyos információk alapján kikeresgetMethod(String,Class<?>...)getField(String)stb.

Kilistázza az összesetgetMethods()getFields()stb.

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 19: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Objektumok létrehozása

Class.newInstanceCsak paraméter nélküli konstruktoron keresztül megyA kivételellenorzési mechanizmusnak keresztbevág(propagálja a kivételeket)Probléma a hozzáféréssel

Constructor.newInstanceÚjabb lehetoségParaméterezheto – nem csak paraméter nélkülikonstruktort lehet így hívniA kivételeket csomagolja(InvocationTargetException)AccessibleObject alapon kérheto privát hozzáférés

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 20: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Mit lehet még csinálni a Class segítségével?

típuskényszerítés: public T cast(Object obj)

dinamikus típusellenorzés:public boolean isInstance(Object obj)

lekérdezések (isArray(), isPrimitive(),isLocalClass)név, egyszeru név kanonikus névosztálybetölto

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 21: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Típusok megadása szövegesen

Primitív típusok és void – mint a kulcsszavakReferenciatípusok

tömbök: kódolva (Z,C,B,S,I,J,F,D,L)[I[[C[Ljava.lang.String;

egyebek: minosített teljes névvel

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 22: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Tagok és konstruktorok

java.lang.reflect.Member interfészjava.lang.reflect.Fieldjava.lang.reflect.Methodjava.lang.reflect.Constructor

A Class-ból kiindulva megszerezhetok

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 23: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Attribútumok

FajtáiPéldányattribútumOsztályszintu attribútumFelsorolási típus típusértéke

AlkotóelemeiNévTípusMódosítók, annotációk

Szintetizált attribútumok

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 24: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Érték lekérdezése és beállítása

Object get(Object)

boolean getBoolean(Object)

...void set(Object, Object)

void setBoolean(Object, boolean)

...

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 25: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

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);

}}

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 26: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Auto-(un)boxing

Csak fordításkorÖnelemzés során nem történik megHa Integer lenne Point.x típusa, az elozo példakivételt váltana ki (IllegalArgumentException)

KompatibilitásvizsgálatInteger.class.isAssignableFrom(int.class) == falseint.class.isAssignableFrom(Integer.class) == false

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 27: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Metódusok

LekérdezhetokVégrehajthatók

Példánymetódusok objektumonStatikus metódusok null-on

AlkotóelemeikMódosítók, annotációkKiváltható kivételekParamétertípusokVisszatérési érték típusaTípusparaméterek (ha sablon)Alapértelmezett érték (ha annotációelem)

TulajdonságokisBridge()isSynthetic()isVarArgs()

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 28: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

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());

}

}

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 29: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Konstruktorok

LekérdezhetokPéldányosításhoz használhatókAlkotóelemeik

Módosítók, annotációkKiváltható kivételekParamétertípusokTípusparaméterek (ha sablon)

TulajdonságokisSynthetic()isVarArgs()

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 30: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

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), ...

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 31: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Felsorolási típusok

Ugyanúgy, mint az osztályokTípusértékek: attribútumokVonatkozó muveletek

Class.isEnum()Class.getEnumConstants(),java.lang.reflect.Field.isEnumConstant()

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 32: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Önelemzés tulajdonságai

PozitívumRugalmasságÚjrafelhasználhatóságTovábbfejleszthetoség, adaptálhatóság

NegatívumKöltséges (végrehajtási ido)Futási ideju hibák

nem talál valamitnincs joga valamihez (security manager)

Biztonsági problémákprivát tagokhoz hozzáférés

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 33: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Mire használjuk

Elore nem ismert kódot manipuláló kód írásánálKeretrendszerekJavaBeansEnterprise JavaBeansVizuális szerkesztokNyomkövetok, log-rendszerek, profilozókDinamikus kódtranszformáció

Generatív programozásKóddal paraméterezheto kód

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 34: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

JDBC-s példa

Adatbázist használó programAz adatbáziskezelo lelkét ismero komponensFüggetlenek egymástól

JDBC-driver betöltése a kódbaClass.forName(args[0]);

JDBC-driver nevének átadása$ javac MyApp.java$ java MyApp com.mysql.jdbc.Driver

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 35: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

JavaBeans

Programozási konvencióknak megfelelo osztályoksetter/getter alapján „property”-ktulajdonságszerkesztok, -konfigurálókeseményvezérelt viselkedés, figyelok (listener)

Grafikus felület, szerializálhatóságVizuális szerkesztokbenJSP

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell

Page 36: Önelemzés és a JavaBean komponensmodellaszt.inf.elte.hu/~kto/teaching/java/material/reflection.pdfÖnelemzés Introspection, reflection Futás közben vizsgáljuk a kódot Aktiválhatjuk

Osztálybetölto

A dinamikus szerkesztés elso lépése a betöltésEgy virtuális gépben több betölto is lehetKonfigurálhatók, programozhatókEgy betöltött kód tulajdonságai függnek a használtbetöltotol (pl. security)

Kozsik Tamás [email protected] http://kto.web.elte.hu/ Önelemzés és a JavaBean komponensmodell