Reinhard Stumptner Seminar Softwareentwicklung Dynamisches Laden und Binden in Java.

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

Objektorientierte Programmierung
der Universität Oldenburg
Imperative Programmierung
Imperative Programmierung
der Universität Oldenburg
der Universität Oldenburg
DVG Dateien Dateien. DVG Dateien 2 Die Klasse File Die Klasse File stellt die Verbindung zwischen dem Filesystem des Rechners und dem.
DVG Einfache Klassen Einfache Klassen. DVG Einfache Klassen 2 Strukturen Beispiel: Personendaten bestehen aus –String name –String vorname.
Kritische Betrachtung
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
Kapselung , toString , equals , Java API
der Universität Oldenburg
Ausnahmen HS Merseburg (FH) WS 06/07.
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Indirekte Adressierung
FH-Hof Indirekte Adressierung Richard Göbel. FH-Hof Einfache Speicherung von Daten Eine "einfache" Deklaration definiert direkt eine Speicherplatz für.
Java: Grundlagen der Sprache
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Konstruktoren.
Objekte und Arbeitsspeicher
ARRAY oder FELD oder VEKTOR
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 3 Klassen, Objekte, Arrays und Kontrollstrukturen Sommersemester 2003 Lars Bernard.
Diskrete Mathematik I Vorlesung Arrays-
Java-Kurs - 2. Übung Entwicklungsumgebung Struktur von Programmen
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
Programmieren mit JAVA
Programmieren mit JAVA
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
Zusammenfassung Vorwoche
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
1DVG3 - anonyme Klassen Anonyme Klassen. DVG3 - anonyme Klassen 2 Syntax new BasisKlasse(Parameterliste) { Modifikationen und Erweiterungen der Basisklasse.
DVG Kommentare1 Kommentare. DVG Kommentare 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht.
DVG Einführung in Java1 Einführung in JAVA.
DVG Klassen und Objekte
DVG Einfache Klassen 1 Einfache Klassen. 2DVG Einfache KlassenStrukturen Beispiel: Personendaten bestehen aus String name String name.
DVG Kommentare 1 Kommentare. 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht bis zum Ende der Zeile.
Java in 9 Folien Besser: Online-Buch Go to Java 2.
© 2005 Pohlig - Taulien Datenströme GK Informatik 1 Datenströme.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
EPROG Tutorium Einheit 4 Klassen und Objekte. Wiederholung Schleifen do... while while for break/continue Strings String char Methoden für Strings Arrays.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Variablenkonzept Klassisch, in Java Basistyp
Die Architektur der Java-VM
Wilfried Imrich CuP - Java Erste Vorlesung Entspricht ungefähr Kapitel 1.1 des Skriptums Wilfried Imrich Montanuniversität Leoben Freitag, 4. Oktober 2002.
CuP - Java Neunte Vorlesung Entspricht Kapitel 4.2 und 5 des Skriptums
CuP - Java Vierte Vorlesung Entspricht ungefähr Kapitel 2.1 des Skriptums Montag, 14. Oktober 2002.
Programmiervorkurs WS 2014/15 Instanzmethoden
Programmiervorkurs WS 2014 Referenzdatentypen
CuP - Java Achte Vorlesung Entspricht ungefähr Kapitel 4.1 des Skriptums Montag, 28. Oktober 2002.
Informatik I : Software höhere Programmiersprachen Java Klassen: hat Methoden (Funktionen) und Daten (Variablen) es kann mehrere Klassen geben nur eine.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold.
Java-Kurs - 3. Übung Hausaufgabe Arrays For-Schleifen.
Diskrete Mathematik I Vorlesung 2 Arrays.
Einführung in die Programmierung mit Java
Java-Kurs Übung Besprechung der Hausaufgabe
Java Programme nur ein bisschen objektorientiert.
Konstruktoren.
Grundkurs Informatik 11-13
Implementieren von Klassen
 Präsentation transkript:

Reinhard Stumptner Seminar Softwareentwicklung Dynamisches Laden und Binden in Java

Reinhard Stumptner 2 Dynamisches Laden und Binden in Java Der Lebenszyklus eines Typs Der Lebenszyklus eines Objekts Dynamisches Binden Eigene Lader

Der Lebenszyklus eines TypsReinhard Stumptner 3 Der Lebenszyklus eines Typs

Reinhard Stumptner 4 Class-File laden Drei Hauptaktivitäten: – Erzeugen eines binären Datenstroms – umwandeln dieser Daten in interne Strukturen (Method Area) – Erzeugen einer Instanz von java.lang.Class Die Class - Instanz dient als Interface zwischen Programm und internen Datenstrukturen (Method Area) Geladen wird entweder mit dem Bootstrap Class Loader (Teil der JVM) oder mit benutzerdefinierten Ladern Benutzerdefinierte Lader könnten z.B. Dateien von einem Netzwerk laden oder verschlüsselte Dateien laden

Der Lebenszyklus eines TypsReinhard Stumptner 5 Class-File verifizieren Entspricht es der Semantik von Java? Prüfungen in der Verifikationsphase: – Von final Klassen wurde nicht geerbt – Final Methoden wurden nicht überschrieben – Keine inkompatiblen Methodendeklarationen – Einträge im Constant Pool sind untereinander konsistent – Integritätsprüfung des Bytecodes

Der Lebenszyklus eines TypsReinhard Stumptner 6 Vorbereiten des Typs Für die Klassenvariablen wird Speicher reserviert und mit 0 initialisiert Anlegen zusätzlicher Datenstrukturen (Methodentabelle)

Der Lebenszyklus eines TypsReinhard Stumptner 7 Constant Pool auflösen

Der Lebenszyklus eines TypsReinhard Stumptner 8 Initialisieren des Typs Class Variable Initializer: class ClassInit { static int i=3*5*Math.random(); } Static Initializer: class StaticInit { static int i; static { i=13*Math.random(); } 2 Schritte der Initialisierung: – Initialisieren der direkten Superklasse (wenn nicht bereits initialisiert) – Ausführen von () (mit enthaltenen Initializern) Initialisierung vor erster aktiver Verwendung

Der Lebenszyklus eines TypsReinhard Stumptner 9 Initialisieren des Typs Aktive vs. Passive Verwendung class A { static int x=10*Math.random(); static {System.out.println(init A);} } class B extends A { static int y=20*Math.random(); static {System.out.println(init B);} } class C { static { System.out.println(init C);} public static void main(String[] args) { int z=B.x; // aktive Verwendung von A, // passive Verwendung von B System.out.println(finished); } Ausgabe:init C init A finished

Der Lebenszyklus eines ObjektsReinhard Stumptner 10 Der Lebenszyklus eines Objekts Das Erzeugen einer Instanz stellt den Beginn des Lebenszyklus eines Objekts dar, Garbage Collection (bzw. finalize() ) dessen Ende Method Area Heap Class -Instanz für A new A() Typinformation von A

Der Lebenszyklus eines ObjektsReinhard Stumptner 11 Instanzieren einer Klasse vier Arten: – new() A obj = new A(); – newInstance()(java.lang.Class) Class myClass=Class.forName(Name); Name obj = (Name) myClass.newInstance(); – clone() A obj2 = obj.clone(); – Deserialisieren eines Objekts mit getObject(), enthalten in java.io.ObjectInputStream

Der Lebenszyklus eines ObjektsReinhard Stumptner 12 Instanzieren einer Klasse Reservieren von Speicher am Heap – für Instanzvariablen der Klasse und die der Superklassen – default Initialwert (0) Instanzvariablen mit den richtigen Startwerten versehen zumindest eine () Methode wird erzeugt (Konstruktor)

Der Lebenszyklus eines ObjektsReinhard Stumptner 13 Instanzieren einer Klasse public class Konstruktoren { public String name; public int min=0, max=10; (Initializer) public Konstruktoren(String name) { // Aufruf des default Konsruktors von Object, // Ausführen von min=0, max=10 this.name=name; } public Konstruktoren(String name, int min) { this(name); // kein Aufruf des Konsruktors von Object this.min=min; }

Der Lebenszyklus eines ObjektsReinhard Stumptner 14 Freigeben eines Objekts Programme können Speicher für Objekte am Heap reservieren, aber nicht explizit freigeben Garbage Collector Besitzt eine Klasse eine finalize() Methode, wird diese, vor Freigeben des Speichers des Objekts, ausgeführt

Der Lebenszyklus eines ObjektsReinhard Stumptner 15 Freigeben eines Typs Typen werden, wenn sie nicht mehr benötigt werden, freigegeben, d.h. wenn sie nicht erreichbar sind

Reinhard Stumptner 16 Dynamisches Binden – The Linking Model Auflösen symbolischer Referenzen Dynamische Erweiterung Parent-Delegation Model Constant Pool Resolution

The Linking ModelReinhard Stumptner 17 Auflösen symbolischer Referenzen.class Dateien werden beim Kompilieren durch symbolische Referenzen im Constant Pool verbunden Diese müssen vor Programmstart aufgelöst und durch direkte Referenzen ersetzt werden (constant pool resolution) frühe – späte Resolution

The Linking ModelReinhard Stumptner 18 Dynamische Erweiterung Java Applikationen können zur Laufzeit entscheiden, welche Typen geladen und gebunden werden sollen Zwei Mechanismen: – java.lang.Class : (hier wird immer gebunden) public static Class forName (String className, boolean initialize, ClassLoader loader) throws ClassNotFoundException; – java.lang.ClassLoader : (Binden offen) protected Class loadClass (String name, boolean resolve) throws ClassNotFoundException;

The Linking ModelReinhard Stumptner 19 Parent-Delegation Model Versucht ein Lader einen Typ zu laden, gibt er diesen Auftrag immer zuerst an seine Superklasse weiter. Am Ende dieser Aufrufkette steht der Bootstrap Class Loader Lader, der eine Klasse lädt: definierender Class Loader Lader, der einen anderen Lader mit dem Ladeprozess beauftragt: initialisierender Class Loader

Constant Pool ResolutionReinhard Stumptner 20 Constant Pool Resolution Der Constant Pool ist mit Symboltabellen vergleichbar Struktur eines Eintrags: CONSTANT_Class_Eintrag { byte Tag(=7); short Namensindex; } Typen der Einträge im Konstantenpool

Constant Pool ResolutionReinhard Stumptner 21 Resolution von Klassen und Interfaces Auflösen einer symbolischen Referenz auf eine Klasse: 1. C und Superklassen laden – Wurde C noch nicht geladen, sucht die JVM nach C.class – C binden, verifizieren und vorbereiten – binäre Datenstruktur von C prüfen 2. C wird initialisiert 3. Zugriffsrechte werden überprüft Verwendeter Lader: der, mit dem referenzierende Klasse geladen wurde

Constant Pool ResolutionReinhard Stumptner 22 Resolution von Array Klassen Anzahl der Dimensionen und Basistyp aus dem field descriptior auslesen. Anzahl von [ gibt Dimensionen an Basistyp: – primitiver Datentyp (erstes Zeichen ist kein L) Z….boolean, B….byte, I….int, … – Referenztyp diesen laden, binden Von Bootstrap geladen

Constant Pool ResolutionReinhard Stumptner 23 Resolution von Feldern und Methoden CONSTANT_Fieldref : Klassen- oder Instanzvariable CONSTANT_Methodref : Methode einer Klasse Klassenvariablen, statische Methoden werden durch Referenz auf Typinformationen aufgelöst

Constant Pool ResolutionReinhard Stumptner 24 Resolution von Feldern und Methoden Direkte Referenzen von Instanzvariablen und –methoden entsprechen einem Offset class A { int x; String s=Hello; public void getX(){return x;} } 0Zeiger in Method Area 1x 2s A- Instanz

Constant Pool ResolutionReinhard Stumptner 25 Resolution von Feldern und Methoden Methodentabelle von A: 0Zeiger auf wait() 1Zeiger auf clone() 2Zeiger auf equals() 3Zeiger auf finalize() 4Zeiger auf getClass() 5Zeiger auf hashCode() 6Zeiger auf notify() 7Zeiger auf notifyAll() 8Zeiger auf toString() 9Zeiger auf getX() Typinformation von Object Typinformation von A

Constant Pool ResolutionReinhard Stumptner 26 Resolution von Strings CONSTANT_String ( java.lang.String ), verweist auf CONSTANT_Utf8 Gleiche Strings verweisen auf selbe Instanz der Klasse String Resolution: String- Objekt wird erzeugt und als direkte Referenz eingetragen

Constant Pool ResolutionReinhard Stumptner 27 Resolution von anderen Elementen im Constant Pool CONSTANT_Integer, CONSTANT_Long, CONSTANT_Float und CONSTANT_Double werden direkt dargestellt: CONSTANT_Integer { byte tag=3; int wert; } CONSTANT_NameAndType und CONSTANT_Utf8 werden nicht aufgelöst, sie können von anderen Einträgen referenziert werden

Constant Pool ResolutionReinhard Stumptner 28 Beispiel: Salutation- Applikation class Salutation { private static final String hello=Hello, world!; private static final String greeting=Greetings, planet!; private static final String salutation=Salutations, orb!; private static int choice=(int)(Math.random()*2.99); public static void main(String[] args) { String s =hello; if (choice==1) s=greeting; else if (choice==2) s=salutation; System.out.println(s); } Beim Initialisieren wird sichergestellt, dass alle Superklassen von Salutation initialisiert wurden.

Constant Pool ResolutionReinhard Stumptner 29 Beispiel: Salutation- Applikation Verifikation: – Bytecode ist syntaktisch korrekt – Salutation entspricht der Java Semantik – Salutation wird die JVM nicht zum Absturz bringen (Jumps) Vom Compiler wurde.class Datei mit Constant Pool erzeugt

Constant Pool ResolutionReinhard Stumptner 30 Beispiel: Salutation- Applikation Symbolische Referenz zu Hello, world!

Constant Pool ResolutionReinhard Stumptner 31 Beispiel: Salutation- Applikation Symbolische Referenzen von Salutation zu Math.random()

Constant Pool ResolutionReinhard Stumptner 32 Beispiel: Salutation- Applikation Symbolische Referenz zu System.out

Constant Pool ResolutionReinhard Stumptner 33 Beispiel: Salutation- Applikation Symbolische Referenz zu PrintStream.println()

Constant Pool ResolutionReinhard Stumptner 34 Beispiel: Salutation- Applikation private static int choice=(int)(Math.random()*2.99); (): 0 invokestatic #13 java.lang.Math laden und binden direkte Referenz eintragen 3 ldc2_w #14 Wert dmul// Multiplikation 7 d2i// Konvertierung: double int 8 putstatic #10 choice direkt referenzieren 11 return

Constant Pool ResolutionReinhard Stumptner 35 Beispiel: Salutation- Applikation main(): 0 ldc #2 2 astore_1// speichert Referenz in 1. lokalen Variable // s = hello; 3 getstatic #10 6 iconst_1// push 1 7 if_icompne 16// if (choice == 1) (choice sei hier =2) 10 ldc #1 12 astore_1// s = greeting; 13 goto getstatic #10 19 iconst_2// push 2 20 if_icompne 26// if (choice == 2)

Constant Pool ResolutionReinhard Stumptner 36 Beispiel: Salutation- Applikation main(): 23 ldc #3 25 astore_1// s = salutation; 26 getstatic #11 29 aload_1// push s für System.out.println(s); 30 invokevirtual #12 <Method void println(java.lang.String) 33 return

Constant Pool ResolutionReinhard Stumptner 37 Beispiel: Salutation- Applikation Auflösen der symbolischen Referenzen: ldc #2 – CONSTANT_String_info – String Objekt Hello, world! wird erzeugt, Referenz vermerken – ldc ldc_quick getstatic #10 – Eintrag #10 wurde bei () aufgelöst, getstatic getstatic_quick getstatic #10 – bereits aufgelöst, getstatic getstatic_quick ldc #3 – CONSTANT_String_info – String Objekt erzeugen, Referenz bei Eintrag #3 vermerken – ldc ldc_quick

Constant Pool ResolutionReinhard Stumptner 38 Beispiel: Salutation- Applikation Auflösen der symbolischen Referenzen: getstatic #11 – CONSTANT_Fieldref_info – java.lang.System laden und binden – Prüfung auf Vorhandensein eines statischen Feldes out – direkte Referenz zum Feld wird installiert, getstatic getstatic_quick invokevirtual #12 – CONSTANT_Methodref_info – java.io.PrintStream laden und binden – Prüfung: Methode public, Rückgabe: void Parameter: String – invokevirtual invokevirtual_quick

Reinhard Stumptner 39 Eigene Lader public class Base { public Base b; public Base() { b = null; System.out.println("\tBase Konstruktor"); } public void print() {System.out.println("\tPrint Base");} } public class Derived extends Base { public Derived() { System.out.println("\tDerived Konstruktor"); }

Reinhard Stumptner 40 Eigene Lader class MyLoader extends ClassLoader { public Class findClass(String name) throws ClassNotFoundException { Class newClass=searchLoadedType(name); if (newClass==null){ byte[] classData = loadClassData(name); newClass=defineClass(name, classData, 0, classData.length); } return newClass; } private byte[] loadClassData(String name) throws ClassNotFoundException { File source=new File(name+".class"); BufferedInputStream in=… byte[] b=new byte[in.available()]; in.read(b, 0, in.available()); return b; }

Reinhard Stumptner 41 Eigene Lader Verwendung eines benutzerdefinierten Laders: MyLoader l=new MyLoader(); Class c1=l.loadClass("Derived"); c1.getClassLoader();// Lader eines Typs kann // abgerufen werden java.lang.reflect.Method m; m=c1.getMethod("print", null); Object o=c1.newInstance(); m.invoke(o,null); // Ausführen der Methode // print() des erzeugten // Objekts

Reinhard Stumptner 42 Eigene Lader class MyDecryptLoader extends ClassLoader { public Class findClass(String name) throws ClassNotFoundException{ classData = loadClassData(name,key); … } public byte[] loadClassData(String name, byte key){ byte[] b=null; in.read(b, 0, in.available()); for (int i=0; i<b.length; i++) b[i]=(byte)(b[i] ^ key); return b; }

Reinhard Stumptner 43 Eigene Lader public class CompilingClassLoader extends ClassLoader { private boolean compile(String javaFile) throws IOException { Process p = runtime.getRuntime().exec ("javac "+javaFile); p.waitFor(); return p.exitValue() == 0; } public Class loadClass(String name, boolean resolve) throws ClassNotFoundException { Class c = null; if (!compile(name+".java") throw new ClassNotFoundException(); … c = defineClass(name, raw, 0, raw.length); resolveClass(c); }