21. Juni 2012 ... Erweiterte Java Programmierung. - dynamisches ... damit vereint eine Java-
Klasse alle 3 Eigenschaften damit auf eine ... effektiv ein Zip-Archiv.
Erweiterte Java Programmierung Malte Gräper dynamisches Laden Übersicht Plugin JAR-Datei ClassLoader Class-FileFormat
Erweiterte Java Programmierung - dynamisches Laden Malte Gräper Fachbereich Technik Department Elektrotechnik und Informatik
21. Juni 2012
Malte Gräper
Erweiterte Java Programmierung
1/23
Übersicht Erweiterte Java Programmierung Malte Gräper dynamisches Laden Übersicht Plugin JAR-Datei ClassLoader Class-FileFormat
Plugin JAR-Datei ClassLoader Class-File-Format
Malte Gräper
Erweiterte Java Programmierung
2/23
Plugins dynamisch Laden Erweiterte Java Programmierung Malte Gräper dynamisches Laden Übersicht Plugin JAR-Datei ClassLoader Class-FileFormat
Code kann von mehreren Programmen genutzt werden => kleinere Programme
einzelne “Teile“ eines Programms können getauscht werden die Funktionalität kann erweitert werden spezielle Funktionen je nach Platform/Infrastruktur
Malte Gräper
Erweiterte Java Programmierung
3/23
Win/Linux Bibliotheken Erweiterte Java Programmierung Malte Gräper
andere Programmiersprachen erlauben dies auch z.B. C/C++
dynamisches Laden
bei Win sind dies DLLs
Übersicht Plugin JAR-Datei ClassLoader Class-FileFormat
=> integraler Bestandteil des BS
Linux nutzt auch Bibliotheken bzw. libraries (dynamisch *.so, statisch *.a) DLL/libs sind jedoch nicht ausführbar => statische/dynamische Bibliotheken voneinander getrennt
Java ist (etwas) anders
Malte Gräper
Erweiterte Java Programmierung
4/23
Klassen in Java Erweiterte Java Programmierung Malte Gräper dynamisches Laden Übersicht Plugin JAR-Datei ClassLoader Class-FileFormat
jede Klasse (im Source-Code) wird in eine separate Class-File übersetzt Class-File enthält alle wichtigen Informationen Basis-Klassen Methoden Attribute (Felder) uvm...
jede Klasse ist (theoretisch) ausführbar, dynamisch oder statisch ladbar damit vereint eine Java-Klasse alle 3 Eigenschaften
damit auf eine Klasse zugegriffen werden kann muss diese geladen sein egal ob statisch dynamisch daher gibt es ClassLoader- Konzept in Java Malte Gräper
Erweiterte Java Programmierung
5/23
Plugins in Java Erweiterte Java Programmierung Malte Gräper dynamisches Laden Übersicht Plugin JAR-Datei ClassLoader Class-FileFormat
jedes Plugin ist eine Klasse, die dynamisch geladen werden kann daher kennt der Compiler die Klassen nicht Problem: Klassen können nicht “normal“ erzeugt werden => Methoden, Felder, etc unbekannt Ursache: der Compiler löst Namen zur Compile-Time auf (übersetzt in Index) z.B. Methoden
Zugriff über Reflection-API möglich deshalb: Schnittstelle(n) definieren welche alle Plugins unterstützen somit weiß der Compiler welche Funktionen etc auf jeden Fall unterstützt werden
Malte Gräper
Erweiterte Java Programmierung
6/23
Beispiel I Erweiterte Java Programmierung Malte Gräper dynamisches Laden Übersicht Plugin JAR-Datei ClassLoader Class-FileFormat
Malte Gräper
einfaches Beispiel zum Laden von einer Klasse dafür URLClassLoader verwendet
Erweiterte Java Programmierung
7/23
JAR-Datei Erweiterte Java Programmierung Malte Gräper
Bibliothek-Format von Java
dynamisches Laden
enthält (mehrere) Class-Files, auch weitere Resourcen möglich
Übersicht Plugin JAR-Datei ClassLoader Class-FileFormat
Vorteil: alle Klassen u Daten zusammen mit Resource Manifest auch ausführbar
effektiv ein Zip-Archiv nicht vorgeschriebenes Format => auch andere (selbst definierte) möglich Java stellt API zur Verfügung
Malte Gräper
Erweiterte Java Programmierung
8/23
JAR-API Erweiterte Java Programmierung Malte Gräper dynamisches Laden Übersicht Plugin JAR-Datei ClassLoader Class-FileFormat
kapselt Zip-Archiv => ZipInputStream/ZipOutputStream jede Datei/Ordner über ZipEntry repräsentiert Dateien können über getNextEntry durchlaufen werden (ähnlich Iterator) Zugriff auf Daten über Stream Wichtig: Längenangabe im ZipEntry nicht immer korrekt (-1)
Malte Gräper
Erweiterte Java Programmierung
9/23
Der Classloader I Erweiterte Java Programmierung Malte Gräper dynamisches Laden Übersicht Plugin JAR-Datei ClassLoader Class-FileFormat
in Java sind alle Klassen immer dynamisch geladen (selbst statische, anders als bei C/C++) Aufgabe ist dass Bereitstellen der Klassendaten (egal aus welcher Quelle) das eigentliche erzeugen der Klasse läuft über defineClass diese Funktion ist final u Teil der JVM
jede Klassen wird über ClassLoader geladen und ist mit diesem verbunden ClassLoader integraler Bestandteil von Java Bootstrap-Loader bzw. dessen parent Teil der JVM für Anwender jedoch transparent
Malte Gräper
Erweiterte Java Programmierung
10/23
Der Classloader I
Malte Gräper dynamisches Laden Übersicht Plugin JAR-Datei ClassLoader Class-FileFormat
Malte Gräper
hierarchisch aufgebaut somit kapselt ClassLoader Sichtbarkeit von Klassen Grafik: http://media.developeriq.in
Erweiterte Java Programmierung
Erweiterte Java Programmierung
11/23
Der Classloader II Erweiterte Java Programmierung Malte Gräper
3 Phasen dynamisches Laden Übersicht Plugin JAR-Datei ClassLoader Class-FileFormat
Laden => physikalische bereitstellen der Daten Linken Bytecode überprüfen => Konsistenz, schadhafter Code (Viren?), etc) Vorbereiten Auflösen der Abhängigkeiten (laden der Basis-Klassen etc)
Initialisieren, statische Felder, Ctor etc
Malte Gräper
Erweiterte Java Programmierung
12/23
Der Classloader II Erweiterte Java Programmierung
Grafik: http://www.techjava.de
Malte Gräper dynamisches Laden Übersicht Plugin JAR-Datei ClassLoader Class-FileFormat
Malte Gräper
Erweiterte Java Programmierung
13/23
Ein eigener ClassLoader Erweiterte Java Programmierung Malte Gräper
erbt von der Basis-Klasse ClassLoader
dynamisches Laden
muss in Hierarchie eingebunden werden => parent-ClassLoader
Übersicht Plugin JAR-Datei ClassLoader Class-FileFormat
findClass(String name) überschreiben, bereitstellen der Klassendaten wenn gesuchte Klasse unbekannt => an parent delegieren
protected loadClass(String name,boolean resolve) evtl. überschreiben, finden der Klasse => Cache notwendig Klasse nicht mehrfach definieren daher Cache
Malte Gräper
Erweiterte Java Programmierung
14/23
Beispiel II Erweiterte Java Programmierung Malte Gräper dynamisches Laden Übersicht Plugin JAR-Datei ClassLoader Class-FileFormat
Malte Gräper
MyClassLoader-Klasse implementiert eigenen ClassLoader nur findClass-Funktion überschrieben nutzt Zip-API zum Einlesen von JAR-Dateien und entpackt diese in RAM
Erweiterte Java Programmierung
15/23
ClassLoader Probleme/Möglichkeiten Erweiterte Java Programmierung Malte Gräper dynamisches Laden Übersicht Plugin JAR-Datei ClassLoader Class-FileFormat
eigene ClassLoader nicht ganz ungefährlich theoretisch kann z.B. String-Klasse ersetzt werden daher eigene ClassLoader nicht immer möglich (manche Web-Applets)
Klassen können mehrfach geladen werden (aber nicht über selben ClassLoader) das kann gewollt sein (z.B. self-modifying-code) aber möglicherweise Versions-Probleme Wichtig: trotz gleichem Name => Klassen nicht identisch
viele Andere Probleme möglich z.B. wenn Klasse mehrfach über verschiedene ClassLoader erzeugt Vergleiche wie Obj instanceof A nicht mehr korrekt
Fazit: viele Möglichkeiten => aber vorsichtig Malte Gräper
Erweiterte Java Programmierung
16/23
Beispiel III Erweiterte Java Programmierung Malte Gräper dynamisches Laden Übersicht Plugin JAR-Datei ClassLoader Class-FileFormat
MyClassLoader2 enthält MyClassLoader (nicht erben) wenn JAR-Datei erneut geladen wird, neuer MyClassLoader erzeugt somit kann auch veränderte Klasse erneut geladen werden
Malte Gräper
Erweiterte Java Programmierung
17/23
Java Class File Format Erweiterte Java Programmierung
Java Standart spezifiziert Klassen Format
Malte Gräper
Übersicht Plugin JAR-Datei ClassLoader Class-FileFormat
Malte Gräper
Grafik: http://img.viralpatel.net
dynamisches Laden
Erweiterte Java Programmierung
18/23
Java Class File Format Erweiterte Java Programmierung Malte Gräper dynamisches Laden Übersicht Plugin JAR-Datei ClassLoader Class-FileFormat
Information über Klasse z.B. Zugriffsrechte, Basis-Klasse etc alle Interfaces (von denen die Klasse erbt) die implementierten Methoden (z.B. für Ctor) die Felder einer Klasse mit Name u weiteren Eigenschaften Attribute für die gesamte Klasse (z.B. SourceCode zur Unterstützung bei debugging)
Malte Gräper
Erweiterte Java Programmierung
19/23
Java Class File Format Erweiterte Java Programmierung Malte Gräper dynamisches Laden Übersicht Plugin JAR-Datei ClassLoader Class-FileFormat
Malte Gräper
Kern ist Constant Pool hier werden alle Daten wie Konstanten, String aber auch Typinformationen etc abgelegt in der restlichen Datei werden diese Einträge nur über Index referenziert Vorteil: Daten müssen nicht mehrfach gespeichert werden nach Laden der Klasse => Constant Pool im Speicher zugreifbar
Erweiterte Java Programmierung
20/23
Java Class File Format Erweiterte Java Programmierung
Grafik: http://img.viralpatel.net
Malte Gräper dynamisches Laden Übersicht Plugin JAR-Datei ClassLoader Class-FileFormat
Malte Gräper
Erweiterte Java Programmierung
21/23
Was kann man noch machen Erweiterte Java Programmierung Malte Gräper dynamisches Laden Übersicht Plugin JAR-Datei ClassLoader Class-FileFormat
vor dem Laden Interfaces, Methoden oder Attribute überprüfen/hinzufügen self-modifying-code synthetisch zur Laufzeit generierte Java-Klassen laden dafür gibt es bereits Bibliotheken BCEL, ASM selber schreiben => sehr aufwendig, komplex
komplette Programmiersprache auf Java Bytecode abbilden (JRuby, Groovy) sehr viele Möglichkeiten (wenn auch nicht alle sinnvoll)
Malte Gräper
Erweiterte Java Programmierung
22/23
Beispiel IV Erweiterte Java Programmierung Malte Gräper
MyClassLoader3 erweitert MyClassLoader dynamisches Laden Übersicht Plugin JAR-Datei ClassLoader Class-FileFormat
Malte Gräper
keine Möglichkeit zum Mehrfach-Laden jedoch wird das Class-File-Format eingelesen es kann z.B. vor dem Laden überprüft werden ob Interface vorhanden umbenennen von Funktionen (führt evtl. zu Fehlern) ändern der Klassen-Zugriffsrechte z.B. hinzufügen einer statischen Member-Variable wenn nicht vorhanden
Erweiterte Java Programmierung
23/23