Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

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.

Liknende presentasjoner


Presentasjon om: "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."— Utskrift av presentasjonen:

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 Help"); w.close(); s.close();

7 Bravo.interpret() URLClassLoader ucl = null; String[] lines = input.split("#"); for(int i=0; i

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. r = new equipment.Radio(); Målet med en slik løsning er å gjøre CLASSPATH-informasjon overflødig.

12

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

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

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

16 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]; }

17 public class HelloWorld{ public static void main(String[] args){ System.out.println("Hello World!"); } ca fe ba be d 0a f 09 Êþº¾ a c 69 6e e () f f 4c 69 6e 65 4e V...Code...LineN 75 6d c d umberTable...mai 6e b 4c 6a f 6c 61 6e 67 n...([Ljava/lang 2f e 67 3b a 53 6f 75 /String;)V...Sou c f c 6c 6f 57 rceFile...HelloW 6f 72 6c 64 2e 6a c orld.java c c c 6c 6f Hello W 6f 72 6c a 0c 00 1b 00 1c a orld! c 6c 6f 57 6f 72 6c a HelloWorld...jav 61 2f 6c 61 6e 67 2f 4f 62 6a a/lang/Object... 6a f 6c 61 6e 67 2f d java/lang/System f c 6a f 69...out...Ljava/i 6f 2f e d 3b o/PrintStream; a f 69 6f 2f e java/io/PrintSt d e 74 6c 6e ream...println c 6a f 6c 61 6e 67 2f (Ljava/lang/Str 69 6e 67 3b ing;)V.! d a b b *·..± a b 00 0c % b b b ²....¶..± a a d e

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

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

20 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 = …

21 Fullt kvalifisert typenavn: Foo Lokasjonsinformasjon, som er ca fe ba be a f 09 Êþº¾ a c 69 6e e () f f 4c 69 6e 65 4e V...Code...LineN 75 6d c d umberTable...mai 6e b 4c 6a f 6c 61 6e 67 n...([Ljava/lang 2f e 67 3b a 53 6f 75 /String;)V...Sou c f c 6c 6f 57 rceFile...HelloW 6f 72 6c 64 2e 6a c orld.java c c c 6c 6f Hello W 6f 72 6c a 0c 00 1b 00 1c a orld! c 6c 6f 57 6f 72 6c a HelloWorld...jav 61 2f 6c 61 6e 67 2f 4f 62 6a a/lang/Object... 6a f 6c 61 6e 67 2f d java/lang/System f c 6a f 69...out...Ljava/i 6f 2f e d 3b o/PrintStream; a f 69 6f 2f e java/io/PrintSt d e 74 6c 6e ream...println c 6a f 6c 61 6e 67 2f (Ljava/lang/Str 69 6e 67 3b c ing;)V...URLType f 6f d a 2f 2f...Foo...http:// e e 6f f 66 6f 6f e 6a ar.jar.! d a b b *·..± a b 00 0c % b b b ²....¶..± a a d e 00 1d e 00 1f....

22 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

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

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

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

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

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

28 Krav III: Fellesgjøring Alfa har mottatt melding fra DBs agent: the Text = new Alfa vil hente tilsvarende informasjon fra VG: 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.

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

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

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

32 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) {} }

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

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

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

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

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

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

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

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


Laste ned ppt "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."

Liknende presentasjoner


Annonser fra Google