40
URL-typer i Java

URL-typer i Java

  • Upload
    zelda

  • View
    34

  • Download
    1

Embed Size (px)

DESCRIPTION

URL-typer i Java. Hva er en classloader?. Kompilert Java-kode er i et plattform-uavhengig format (en class-fil). Et Java-program er ikke én eksekverbar fil, men består av mange class-filer. - PowerPoint PPT Presentation

Citation preview

Page 1: URL-typer i Java

URL-typer i Java

Page 2: URL-typer i Java

Hva er en classloader?

• Kompilert Java-kode er i et plattform-uavhengig format (en class-fil).

• Et Java-program er ikke én eksekverbar fil, men består av mange class-filer.

• Class-filer lastes på forespørsel fra programmet. Classloaderen er det objektet som er ansvarlig for utføring av denne jobben.

Page 3: URL-typer i Java

Standard classloading-struktur i J2SE

Bootstrap classloader

|

Standard extensions classloader

|

System classloader

|

- - - - - - - - - - - - - - - - - - - -

Network classloader

Page 4: URL-typer i Java

Lasting av typer

Alle typer må forstås navngitt i to faser: Lokasjon + Typenavn

Fullt kvalifisert typenavn: foo.BarLokasjon: c:\java\myclasses\Lokasjon: c:\java\myclasses.jar

Fordeler:- Enkelt å skrive henvisninger da navnene blir relativt

korte.- Ikke behov for rekompilering da man endrer

miljøvariabelen CLASSPATH til å henvise til riktig lokasjon (eventuelt benytter extensions).

Page 5: URL-typer i Java

Bakgrunn for problemstilling

• Alfa sender en melding til Bravo som sier at Bravo skal laste en klasse Help.

• Bravo er avhengig av at lokasjonen til denne typen er inkludert i en av dens aktuelle classloadere.

• Alfa er ikke sikker på at dette er tilfelle, og sender derfor lokasjonen først, og deretter typen som skal lastes.

Page 6: URL-typer i Java

Alfa.main()

Socket s = new Socket(hostname, port);PrintWriter w = new PrintWriter(s.getOutputStream(),true);w.println("u http://foo.org/#l Help");w.close();s.close();

Page 7: URL-typer i Java

Bravo.interpret()URLClassLoader ucl = null;String[] lines = input.split("#");

for(int i=0; i<lines.length; i++){char command = lines[i].charAt(0);String param = lines[i].split(" ")[1];

if(command == 'u'){ucl = new URLClassLoader(new URL[]{new URL(param)});

}else if(command == 'l'){Class clas = null;if(ucl != null)clas = ucl.loadClass(param);else clas = Class.forName(param);Object o = clas.newInstance();

}}

Page 8: URL-typer i Java

Help (ver.1)

Denne versjonen refererer til core API klassene: • java.lang.System• java.io.PrintStream • java.lang.String

public class Help{

public Help(){

System.out.println(”Instance created”);

}

}

Page 9: URL-typer i Java

Help (ver.2)

Denne versjonen refererer til klassene: • java.lang.System• java.io.PrintStream• java.lang.String• equipment.Radio (http://foo.org/)

public class Help{public Help(){

equipment.Radio.sendSOS();System.out.println(”Instance created and SOS

sent”);}

}

Page 10: URL-typer i Java

Oppsummering

• Konseptet med den underforståtte bruken av CLASSPATH + typenavn i en situasjon der adaptive programmer skal utveksle kommandoer og tilpasse seg hverandre, dekker ikke alle behov.

• Forutsetningen om at programmereren kan sette CLASSPATH når det trengs, er ikke lenger levedyktig. Det blir nødvendig å uttrykke typehenvisninger som inneholder navn og informasjon om lokasjon.

Page 11: URL-typer i Java

Løsning: Innføre URL-typer

• En URL-type inneholder navn og lokasjon.

http://foo.org/equipment.Radio r =

new equipment.Radio();

• Målet med en slik løsning er å gjøre CLASSPATH-informasjon overflødig.

Page 12: URL-typer i Java
Page 13: URL-typer i Java

Krav I: Flyttbarhet

• Ved representasjon av URL-typer i class-filen er det viktig at man forholder seg til JVM-spesifikasjonen, slik at flyttbarheten blir sikret.

• Til tross for at man benytter URL-typer i en classloader-struktur som ikke er modifisert, er det krav om at det skal være mulig å laste og kjøre refererende typer.

Page 14: URL-typer i Java

Class-filen: Generelt

• Inneholder definisjonen av én klasse eller interface.

• En gyldig representasjon av en klasse eller et interface uavhengig av form.

• Inneholder en strøm av 8-bit bytes• JVM-spesifikasjonen, bruke typenavnene u1, u2

og u4 for å representere henholdsvis unsigned en-, to-, eller fire-byte kvantiteter.

(En signed byte har verdiområde fra -127-127. En bit benyttes til å indikere hvorvidt tallet er positivt eller ikke. En unsigned byte har derimot verdiområde fra 0-255, ingen bit benyttes for å indikere fortegn.)

Page 15: URL-typer i Java

Class-filen: Struktur

• Det er ikke mulig å direkte adressere dens elementer.

• Enkelte strukturer har ikke faste størrelser, men holder selv orden på sine lengder.

• For å lese informasjon fra slutten av class-filen, må den traverseres rekursivt.

Page 16: URL-typer i Java

Class-filen: StrukturClassFile{

u4 magic;u2 minor_version;u2 major_version;u2 constant_pool_count;cp_info constant_pool[constants_pool_count-1];u2 access_flags;u2 this_class;u2 super_class;u2 interfaces_count;u2 interfaces[interfaces_count];u2 fields_count;field_info fields[fields_count];u2 methods_count;method_info methods[methods_count];u2 attributes_count;attribute_info attributes[attributes_count];

}

Page 17: URL-typer i Java

public class HelloWorld{public static void main(String[] args){

System.out.println("Hello World!");}

} ca fe ba be 00 00 00 31 00 1d 0a 00 06 00 0f 09 Êþº¾...1........00 10 00 11 08 00 12 0a 00 13 00 14 07 00 15 07 ................00 16 01 00 06 3c 69 6e 69 74 3e 01 00 03 28 29 .....<init>...()56 01 00 04 43 6f 64 65 01 00 0f 4c 69 6e 65 4e V...Code...LineN75 6d 62 65 72 54 61 62 6c 65 01 00 04 6d 61 69 umberTable...mai6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 n...([Ljava/lang2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 /String;)V...Sou72 63 65 46 69 6c 65 01 00 0f 48 65 6c 6c 6f 57 rceFile...HelloW6f 72 6c 64 2e 6a 61 76 61 0c 00 07 00 08 07 00 orld.java.......17 0c 00 18 00 19 01 00 0c 48 65 6c 6c 6f 20 57 .........Hello W6f 72 6c 64 21 07 00 1a 0c 00 1b 00 1c 01 00 0a orld!...........48 65 6c 6c 6f 57 6f 72 6c 64 01 00 10 6a 61 76 HelloWorld...jav61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 01 00 10 a/lang/Object...6a 61 76 61 2f 6c 61 6e 67 2f 53 79 73 74 65 6d java/lang/System01 00 03 6f 75 74 01 00 15 4c 6a 61 76 61 2f 69 ...out...Ljava/i6f 2f 50 72 69 6e 74 53 74 72 65 61 6d 3b 01 00 o/PrintStream;..13 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 74 .java/io/PrintSt72 65 61 6d 01 00 07 70 72 69 6e 74 6c 6e 01 00 ream...println..15 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 .(Ljava/lang/Str69 6e 67 3b 29 56 00 21 00 05 00 06 00 00 00 00 ing;)V.!........00 02 00 01 00 07 00 08 00 01 00 09 00 00 00 1d ................00 01 00 01 00 00 00 05 2a b7 00 01 b1 00 00 00 ........*·..±...01 00 0a 00 00 00 06 00 01 00 00 00 01 00 09 00 ................0b 00 0c 00 01 00 09 00 00 00 25 00 02 00 01 00 ..........%.....00 00 09 b2 00 02 12 03 b6 00 04 b1 00 00 00 01 ...²....¶..±....00 0a 00 00 00 0a 00 02 00 00 00 03 00 08 00 04 ................00 01 00 0d 00 00 00 02 00 0e ..........

Page 18: URL-typer i Java

Opprinnelig løsningsstrategi:

Kodete URL-navnEt gyldig typenavn er bygd opp av bokstaver og sifre, samt tegnene ’_’ og ’$’. Dersom en CONSTANT_Class_info henviser til et ugyldig navn, vil java.lang.ClassFormatError kastes.

Page 19: URL-typer i Java

Class-filen: Attributter

• JVM-spesifikasjonen definerer flere forskjellige attributter.

• JVM-implementasjon må ignorere alle attributter den ikke gjenkjenner. – Dette gjør det mulig å definere nye attributter

for å støtte leverandør-spesifikk debugging, eventuelt å pakke utvidet informasjon inn i class-filen.

Page 20: URL-typer i Java

URLType_attribute

URLType_attribute{

u2 attribute_name_index;

u4 attribute_length;

u2 typename_ index;

u2 location_index;

}

attribute_name_index -> CONSTANT_Utf8_info = ’URLType’

Attribute_length = 4

typename_index -> CONSTANT_Utf8_info = …

location_index -> CONSTANT_Utf8_info = …

Page 21: URL-typer i Java

Fullt kvalifisert typenavn: FooLokasjonsinformasjon, som er http://www.bar.org/foobar.jar.

ca fe ba be 00 00 00 31 00 20 0a 00 06 00 0f 09 Êþº¾...1. ......00 10 00 11 08 00 12 0a 00 13 00 14 07 00 15 07 ................00 16 01 00 06 3c 69 6e 69 74 3e 01 00 03 28 29 .....<init>...()56 01 00 04 43 6f 64 65 01 00 0f 4c 69 6e 65 4e V...Code...LineN75 6d 62 65 72 54 61 62 6c 65 01 00 04 6d 61 69 umberTable...mai6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 n...([Ljava/lang2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 /String;)V...Sou72 63 65 46 69 6c 65 01 00 0f 48 65 6c 6c 6f 57 rceFile...HelloW6f 72 6c 64 2e 6a 61 76 61 0c 00 07 00 08 07 00 orld.java.......17 0c 00 18 00 19 01 00 0c 48 65 6c 6c 6f 20 57 .........Hello W6f 72 6c 64 21 07 00 1a 0c 00 1b 00 1c 01 00 0a orld!...........48 65 6c 6c 6f 57 6f 72 6c 64 01 00 10 6a 61 76 HelloWorld...jav61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 01 00 10 a/lang/Object...6a 61 76 61 2f 6c 61 6e 67 2f 53 79 73 74 65 6d java/lang/System01 00 03 6f 75 74 01 00 15 4c 6a 61 76 61 2f 69 ...out...Ljava/i6f 2f 50 72 69 6e 74 53 74 72 65 61 6d 3b 01 00 o/PrintStream;..13 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 74 .java/io/PrintSt72 65 61 6d 01 00 07 70 72 69 6e 74 6c 6e 01 00 ream...println..15 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 .(Ljava/lang/Str69 6e 67 3b 29 56 01 00 07 55 52 4c 54 79 70 65 ing;)V...URLType01 00 03 46 6f 6f 01 00 1d 68 74 74 70 3a 2f 2f ...Foo...http://77 77 77 2e 62 61 72 2e 6f 72 67 2f 66 6f 6f 62 www.bar.org/foob61 72 2e 6a 61 72 00 21 00 05 00 06 00 00 00 00 ar.jar.!........00 02 00 01 00 07 00 08 00 01 00 09 00 00 00 1d ................00 01 00 01 00 00 00 05 2a b7 00 01 b1 00 00 00 ........*·..±...01 00 0a 00 00 00 06 00 01 00 00 00 01 00 09 00 ................0b 00 0c 00 01 00 09 00 00 00 25 00 02 00 01 00 ..........%.....00 00 09 b2 00 02 12 03 b6 00 04 b1 00 00 00 01 ...²....¶..±....00 0a 00 00 00 0a 00 02 00 00 00 03 00 08 00 04 ................00 02 00 0d 00 00 00 02 00 0e 00 1d 00 00 00 04 ................00 1e 00 1f ....

Page 22: URL-typer i Java

Egenskrevet bytekode-manipulator

Fordeler med egenskrevet løsning:

• Kan skalere løsningen etter oppgaven

• Størrelse på ca. 2-4% av BCEL og Javassist

• Raskere enn BCEL og Javassist da enkelte interne struktures ignoreres

Page 23: URL-typer i Java

Egenskrevet bytekode-manipulator

Ved testing av prototypen viste løsningen seg å være tregere enn BCEL og Javassist. Flaskehalsen var følgende kode:

int length = input.readUnsignedShort();

byte[] bytes = new byte[length];

input.read(bytes);

value = new String(bytes, "UTF-8");

Den ble byttet med:

value = input.readUTF()

Page 24: URL-typer i Java

Krav II: Særegne versjoner

• Hvis man forener dynamisk lasting og et ikke-forgrenet classloading-design, vil ikke navneunikhet være tilstrekkelig.

• SAAPP Alfa bes laste:– http://foo.org/ClassA– http://bar.org/ClassB

ClassB refererer til en gammel versjon av ClassC. Når den symbolske referansen fra ClassB skal oppklares, viser det seg imidlertid at ClassA har kommet ClassB i forkjøpet med å laste en nyere versjon av ClassC. Den refererte typen ligger da i namespace og Alfa vil få denne returnert ved oppklaring.

Page 25: URL-typer i Java

Web-tjeneren Tomcat

Løsning som omgår standard foreldre-barn delegerings policy:

Bootstrap|

System|

Common/ \

Catalina Shared / \

Webapp1 Webapp2 ...

Page 26: URL-typer i Java

Modifisert modell Bootstrap

|Extensions

|System

|---------------------

Common- - - - - - - - - - -

/ \ SAAPP1 SAAPP2 ...

Page 27: URL-typer i Java

Egenskaper til løsningsstrategi

• Typer som er tilgjengelig gjennom system classloader og overliggende classloadere vil være endelige. En SAAPP vil ikke kunne få lastet sin særegne versjon av en type dersom en annen versjon er tilgjengelig gjennom system classloader eller overliggende classloadere. Dette gjør at man må være bevisst på hvilke class-filer man gjør tilgjengelig gjennom CLASSPATH eller extensions classloader.

• Common har lokasjoner til typer som skal gjøres tilgjengelig for alle underliggende classloadere og som hver underliggende classloader skal ha mulighet til å laste sin egen versjon av.

Page 28: URL-typer i Java

Krav III: Fellesgjøring

Alfa har mottatt melding fra DBs agent:the Text = new http://www.db.no/Text(“db.no/sporten”);

Alfa vil hente tilsvarende informasjon fra VG: http://www.vg.no/TextAnalyzer.getInfo((Text)the Text());

• I uttrykket ovenfor castes objektet som returneres fra ”the Text()” til Text.

• JVM identifiserer en type med dens fullt kvalifiserte navn, samt tilhørende classloader.

• I uttrykket ovenfor må instansen av Text som det castes til, være lastet av samme classloader som objektet ”the Text()” henviser til, hvis ikke vil ClassCastException kastes.

Page 29: URL-typer i Java

Identifisering av typer

JVM identifiserer en klasse med dens fullt kvalifiserte navn, samt tilhørende classloader. Dette betyr at to classloadere kan laste samme type, men ved sammenligning vil disse regnes som ulike. Typisk kode som vil fremprovosere en feilsituasjon:

MyClassLoader mcl = new MyClassLoader();

Class clas = mcl.loadClass(”Foo”);

Object object = clas.newInstance();

Foo foo=(Foo)object;

Page 30: URL-typer i Java

Testscenario oppsett 1/3

• To meldinger fra forskjellige avsendere blir sendt til Alfa. Den første meldingen ber om at en type ved navn TMP1 skal lastes. Dette er en klasse som skal simulere resultatet av kompilering av en mottatt melding. Den eksekverer følgende kodelinje i konstruktøren:ClassA a = new ClassA();

• Den andre meldingen henviser til TMP2, som wrapper følgende kodelinje:ClassB b = new ClassB();

• Begge TMP-klassene er modifisert med informasjon om URL-typer.

Page 31: URL-typer i Java

Testscenario oppsett 2/3

ClassA oppretter et objekt av ClassC i konstruktøren, og legger en beskjed inn i det. Videre registreres objektet av ClassC i rammeverket, slik at det kan deles med andre SAAPP’er.

public ClassA(){//the commonC = new ClassC();ClassC c = new ClassC();c.setString("This message is set by: " +this);ObjectMediatorX.addObject(this, new

ReferenceWrapper(ClassC.class, "sharedC", null),c);}

Page 32: URL-typer i Java

Testscenario oppsett 3/3

ClassB vil på sin side hente ut det innlagte ClassC objektet fra rammeverket.

public ClassB(){

try {

ClassC c = (ClassC)(ObjectMediatorX.invokeRef(this, new ReferenceWrapper(ClassC.class, "sharedC", null)));

} catch (Exception e) {}

}

Page 33: URL-typer i Java

Testscenario suksesskriterier

• ClassB må hente ut det samme objektet av ClassC, sharedC, som ClassA la inn i rammeverket. Dette har rammeverket ansvar for.

• For at ClassB skal kunne bruke objektet som rammeverket returnerer, må det castes til ClassC. For å unngå feil ved castingprosessen, må classloaderen som laster ClassC ved eksekvering av ClassB sin kode, være den samme som lastet ClassC ved eksekvering av ClassA sin kode. Dette har classloader-strukturen ansvar for.

Page 34: URL-typer i Java

Løsningsstrategi:

Skille mellom URL-typer og vanlige typer

• Når man uttrykker lokasjon i en URL-type, er man som programmerer mer spesifikk og i en viss grad overstyrende i forhold til hvordan egne og andres program skal hente typen.

• En vanlig type vil virke som en type hvis opphav er åpent. Den vil være ubestemt i forhold til hvor den skal lastes fra. Som programmerer vil man overlate til applikasjonen å finne frem til typen som skal benyttes. Dersom typen tas i bruk i en applikasjon hvor den opprinnelige programmereren ikke har kontroll over tilgjengelige lokasjoner, vil den åpne referansen kunne føre til bruk av en allerede lastet type med oppgitt navn.

Page 35: URL-typer i Java

Hva er en URL-type?

• En URL-type består av lokasjon og fullt kvalifisert typenavn.

• Det er ikke en statisk tilstand. En type deklareres ikke i sin egen kildekode som en URL-type, men tilstanden bestemmes av konteksten. Det er en situasjonsbestemt tilstand som gis av refererende type. Dersom en type refererer til Foo, og har informasjon om lokasjonen til Foo, er Foo i dette tilfellet en URL-type.

Page 36: URL-typer i Java

URLTypeClassLoaderInnfører én classloader per URL. Fordeler: • To agenter vil kunne spesifisere at de skal bruke samme

versjon av en type for å kunne utveksle informasjon. Ved casting imellom objektene til disse to agentene vil det ikke oppstå ClassCastException da typen i begge tilfeller lastes fra samme classloader.

• Vil være mulig at én agent kan bruke forskjellige versjoner av samme type. Dette krever imidlertid at deres refererende typer lastes i forskjellige classloadere.

• Dersom en agent har flere lokasjoner å laste fra, er det mulig at riktig versjon ikke lastes dersom man bare bruker én classloader per samtalepartner. Tilfeller hvor dette kan oppstå er når forskjellige versjoner av typen er tilgjengelig på flere enn én av URL'ene i URL-lista. Da vil URL'en som først ble lagt til bli benyttet. Denne muligheten for feil vil ikke være tilstede med den nye løsningsstrategien.

Page 37: URL-typer i Java

URLTypeClassLoader.loadClass()Class c = findLoadedClass(name);if(c == null){ try{ c = findSystemClass(name); }catch(ClassNotFoundException e1){ URLTypeClassLoader cl = (URLTypeClassLoader)urlTypes.get(name); if(cl != null) c = cl.loadClassLocally(name); else{ String pkgname = getPkgName(name); cl = (URLTypeClassLoader)urlPackages.get(pkgname); if(cl != null) c = cl.loadClassLocally(name); else{ Package pkg = findPackage(pkgname); if(pkg != null) c = findClass(name); else{ try{ c = delegator.loadClass(name, this); }catch(ClassNotFoundException e2){ c = findClass(name); } } } } }}

Page 38: URL-typer i Java

CLDelegator.loadClass()public Class loadClass(String name, URLTypeClassLoader classloader)throws

ClassNotFoundException{ Class clas = common.getLoadedClass(name); if(clas == null){ Enumeration cls = classloaders.elements(); while(cls.hasMoreElements()){ URLTypeClassLoader cl = (URLTypeClassLoader)cls.nextElement(); if(cl != classloader) clas = cl.getLoadedClass(name); if(clas != null)return clas; } } if(classloader != common){ try{ return common.loadClassLocally(name); }catch(ClassNotFoundException e1){ return classloader.loadClassLocally(name); } } return null;}

Page 39: URL-typer i Java

Modell av classloading-strukturBootstrap

|Extensions

|System

|---------------------

Common

/ | | \ SAAPP1 URL1 URL2 SAAPP2 ...

Page 40: URL-typer i Java

Problemer / begrensinger

• Ikke mulig å isolere typer fra andre aktører.

• Problemer med pakketilgang grunnet runtime-packages.

• Bryter med innført foreldre-barn delegerings-policy.

• Classloaderen er avhengig av CLDelegator for å fungere

• Strukturen er ”låst”.