1 / 40

URL-typer i Java

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.

zelda
Download Presentation

URL-typer i Java

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. URL-typer i Java

  2. 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.

  3. Standard classloading-struktur i J2SE Bootstrap classloader | Standard extensions classloader | System classloader | - - - - - - - - - - - - - - - - - - - - Network classloader

  4. Lasting av typer Alle typer må forstås navngitt i to faser: Lokasjon + Typenavn Fullt kvalifisert typenavn: foo.Bar Lokasjon: 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).

  5. 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.

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

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

  8. 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”); } }

  9. 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”); } }

  10. 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.

  11. 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.

  12. 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.

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

  14. 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.

  15. Class-filen: Struktur ClassFile{ 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]; }

  16. 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...LineN 75 6d 62 65 72 54 61 62 6c 65 01 00 04 6d 61 69 umberTable...mai 6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 n...([Ljava/lang 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 /String;)V...Sou 72 63 65 46 69 6c 6501 00 0f 48 65 6c 6c 6f 57rceFile...HelloW 6f 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 W 6f 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...jav 61 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/System 01 00 03 6f 75 74 01 00 15 4c 6a 61 76 61 2f 69 ...out...Ljava/i 6f 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/PrintSt 72 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/Str 69 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 ..........

  17. Opprinnelig løsningsstrategi:Kodete URL-navn Et 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.

  18. 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.

  19. 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 = …

  20. Fullt kvalifisert typenavn: Foo Lokasjonsinformasjon, 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...LineN 75 6d 62 65 72 54 61 62 6c 65 01 00 04 6d 61 69 umberTable...mai 6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 n...([Ljava/lang 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 /String;)V...Sou 72 63 65 46 69 6c 65 01 00 0f 48 65 6c 6c 6f 57 rceFile...HelloW 6f 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 W 6f 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...jav 61 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/System 01 00 03 6f 75 74 01 00 15 4c 6a 61 76 61 2f 69 ...out...Ljava/i 6f 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/PrintSt 72 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/Str 69 6e 67 3b 29 56 01 00 07 55 52 4c 54 79 70 65 ing;)V...URLType 01 00 03 46 6f 6f01 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 62www.bar.org/foob 61 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 ....

  21. 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

  22. 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()

  23. 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.

  24. Web-tjeneren Tomcat Løsning som omgår standard foreldre-barn delegerings policy: Bootstrap | System | Common / \ Catalina Shared / \ Webapp1 Webapp2 ...

  25. Modifisert modell Bootstrap | Extensions | System | --------------------- Common - - - - - - - - - - - / \ SAAPP1 SAAPP2 ...

  26. 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.

  27. 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.

  28. 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;

  29. 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.

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

  31. 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) {} }

  32. 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.

  33. 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.

  34. 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.

  35. URLTypeClassLoader Innfø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.

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

  37. 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; }

  38. Modell av classloading-struktur Bootstrap | Extensions | System | --------------------- Common / | | \ SAAPP1 URL1 URL2 SAAPP2 ...

  39. 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”.

More Related