Önelemzés és a javabean...
TRANSCRIPT
Ö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
Ö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
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
Ö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
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
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
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
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
.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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
É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
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
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
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
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
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
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
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
Ö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
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
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
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
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