Dynamisches Laden von Klassen

Slides:



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

DVG Dateien Dateien. DVG Dateien 2 Die Klasse File Die Klasse File stellt die Verbindung zwischen dem Filesystem des Rechners und dem.
Einführung in die Programmierung Ausführbare Klassen
Internetzugriff mit Strings und Streams
Ausnahmen HS Merseburg (FH) WS 06/07.
Java: Dynamische Datentypen
Indirekte Adressierung
FH-Hof Verwaltung von Zeichenketten Richard Göbel.
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
FH-Hof Fehlerbehandlung Richard Göbel. FH-Hof Konzept Fehler können mit dem Operator throw einer übergeordneten Funktion signalisiert werden. Parameter.
IF-ELSE-IF-Ketten Weiter mit PP..
Konstruktoren.
Polymorphie (Vielgestaltigkeit)
Polymorphie (Vielgestaltigkeit)
Benötigte Applets Startseite: in HTML-Format Applet auf der Startseite Das Applet, das auf der Startseite geladen wird, wird die vier Buttons und die eine.
Programmieren mit JAVA
Programmieren mit JAVA
PRJ 2007/1 Stefan Dissmann Motivation Problem: Benutztes Objekt kennt den Kontext seiner Nutzung nicht. Daher kann es in besonderen Situationen keine Entscheidung.
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 Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
Packages Vortrag : Cornelia Hardt 23. November 1999.
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.
EDV Parallelprogrammierung1 Parallelprogrammierung mit JAVA.
DVG Kommentare 1 Kommentare. 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht bis zum Ende der Zeile.
05 - Reflection Das Reflection API Reflection2 Ziel Es kommt vor, dass eine Methode ein Objekt als Parameter übergeben bekommt, ohne dass bekannt.
Java in 9 Folien Besser: Online-Buch Go to Java 2.
Informatikunterricht mit Java
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Eine Entwicklungsumgebung im Web IFC-Seminar WS98/ Holger Otte.
IT2 – WS 2005/20061Oct 10, 2005 Externes Verhalten – Quelltext (source code) Durch Aufrufe der Konstruktoren und Methoden kann das externe Verhalten (=die.
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
CuP - Java Eingabe über Tastatur, AudioClips, überschreiben, Quiz Montag, 18. November 2002.
Objektorientiertes Konstruieren
Aufruf einer Methode eines Objektes vom Typ „Bruch“
Reinhard Stumptner Seminar Softwareentwicklung Dynamisches Laden und Binden in Java.
Optimale Ursprungsgerade
Starten der Entwicklungsumgebung (IDE)
Learning By Doing Parallelverarbeitung Multithreading (Nebenläufigkeit) Alte Idee der Parallelverarbeitung statt rein sequentieller Prozesse Parallelverarbeitung.
Programmiervorkurs WS 2014/15 Methoden
Programmiervorkurs WS 2014/15 Instanzmethoden
Java-Kurs - 8. Übung Besprechung der Hausaufgabe.
Voyager Eigenschaften/Vorzüge Universalität: –ROI-Modelle: CORBA, RMI, DCOM –verschiedene Namens-, Verzeichnisdienste Nachrichtentypen: synchron, oneway,
CuP - Java Achte Vorlesung Entspricht ungefähr Kapitel 4.1 des Skriptums Montag, 28. Oktober 2002.
3. Beschreibung von Abläufen durch Algorithmen 3.4 Zufall
Informatik I : Software höhere Programmiersprachen Java Klassen: hat Methoden (Funktionen) und Daten (Variablen) es kann mehrere Klassen geben nur eine.
Java Syntaxdiagramme Buchstabe A B Z a z ... Ziffer
Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  Verwendung von.
Übung Informatik I exercise01. 2 Inhaltsübersicht Nachbesprechung Übung 1 Individuelle Fragen/Bemerkungen.
Java-Applets und URLs APP Philip Graf, Andreas Bößl.
Java-Kurs - 4. Übung Hausaufgabe Weitere Kontrollstrukturen
IKG Dörschlag, Plümer, Gröger „Einführung in die Programmierung mit Java“ WS03/04 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung.
Abteilung für Telekooperation Softwareentwicklung 2 UE WS 2008/09 SE2UE_ Ausnahmen (Exceptions)
Reflection API1 Motivation Reflection API Core Reflection API: java.lang.reflect Seit JDK 1.1 integraler Bestandteil der Java- Klassenbibliothek Ermöglicht:
OOP mit Java Oder: Java in 5 Tagen. 1. Tag Klassen und Methoden Hello World in Variationen Von Menschen und Geschlechtern Horden (Schlange stehen)
Java Programme nur ein bisschen objektorientiert.
Ein-/ Ausgabe in Java ein Überblick. © eigentlich ganz einfach ? Ein-/Ausgabe durch package java.io Ausgabe (auf Konsole) mit System.out.println()
Java I/O Input / Output stream Library
Konstruktoren.
Objektorientierung Gliederung von Daten und Funktionen zu Objekten
JDBC Java DataBase Connectivity
Java-Kurs - 2. Übung primitive Datentypen, Konstanten
Einführung in die Programmierung mit Java
Raphael Fischer Informatik II - Übung 06 Raphael Fischer
Arrays in Java Ein Array ist eine Variable, die aus einer An-zahl von Elementen des gleichen Datentyps besteht, die aufeinanderfolgend im Speicher liegen.
Implementieren von Klassen
Arrays of Objects, a 3 part process
 Präsentation transkript:

Dynamisches Laden von Klassen Die Klasse class und die Klassen des Packages java.lang.reflect erlauben Reflection und Introspection. Klassen können zur Laufzeit geladen, untersucht und instanziert werden. Zu den dann erzeugten Objekten können Methoden aufgerufen werden.

Die Klasse Class Ein Objekt der Klasse Class beschreibt zur Laufzeit eine Klasse In diesem Objekt sind die statischen Variablen der Klasse angelegt. Zu jeder im java-Programm benutzen Klasse gibt es ein solches Objekt der Klasse Class Ein Objekt der Klasse Class bekommt man von einem Objekt über den Aufruf von getClass(). Die Methode Class.forName(Sting classname) lädt eine Klasse und gibt ein Objekt der Klasse Class zurück.

Untersuchen einer Klasse Die Klasse und das Package java.lang.reflect stellen Methoden und Klassen zur Untersuchung einer Klasse bereit. public Constructor<?>[] getConstructors() public Method[] getDeclaredMethods() public int getModifiers() public Class<?>[] getParameterTypes() . . . So wird es möglich, die Eigenschaften einer Klasse und ihrer Methoden komplett auszulesen.

Beispiel zum Auslesen von Informationen Aus einem Objekt Class Class C=Class.forName(ClassName); if (C.isInterface()) { Out=Modifier.toString(C.getModifiers())+C.getName(); } else Out=Modifier.toString(C.getModifiers()) +" class "+C.getName()+"\n" +"extends "+C.getSuperclass().getName()+"\n"; Class[] Interfaces=C.getInterfaces(); if (Interfaces!=null & Interfaces.length>0) Out+="implements "; for (int i=0; i<Interfaces.length; i++) if (i>0) Out+=", "; Out+=Interfaces[i].getName(); Out+="\n"; Out+="{\n";

Field[] Fields=C.getDeclaredFields(); if (Fields.length>0) Out+=" // DataMember\n"; for (int i=0; i<Fields.length;i++) Out+=" "+Fields[i].toString()+";\n"; Constructor[] Constructors=C.getDeclaredConstructors(); if (Constructors.length>0) Out+=" // Constructors\n"; for (int i=0; i<Constructors.length; i++) Out+=" "+Constructors[i].toString()+";\n"; Method[] Methods=C.getDeclaredMethods(); if (Methods.length>0) Out+=" // Methods\n"; for (int i=0; i<Methods.length;i++) Out+=" "+Methods[i].toString()+";\n"; Class[] Classes=C.getClasses(); if (Classes.length>0) Out+=" // Classes / Interfaces\n"; for (int i=0; i<Classes.length;i++) Out+=" "+Classes[i].toString()+";\n"; Out+="}\n"; }

Laden einer Klasse Class X=Class.forName(Name); Instanzieren der Klasse Calculate C=(Calculate)(X.newInstance()); Metodenaufruf System.out.println("Y(x)="+C.fVonX(x)); Caclulate ist ein Interface public interface Calculate { public double fVonX(double x); }

Beispiel: Ausdrucksberechnung Ein Programm solle in der Lage sein, beliebige Ausrücke f(x) zu berechnen. Lösungsansatz 1: Ausdrucksberechner mit Verfahren des rekursiven Abstiegs programmieren. Lösungsansatz 2: Verwendung von Jcup/Jlex um einen Interpreter für Ausdrücke generieren zu lassen Lösungsansatz 3: Generieren eines Javaquelltextes einer Klasse mit der Methode fvonx, Übersetzung, Laden, Instanzieren der Klasse und Ausführung der Methode fvonx.

Erzeugen des Quelltextes Class.forName funktioniert für jede zu ladende Klasse nur ein mal. Workaround: fortlaufend nummerierter Dateiname // Hier wird der Name zusammengebaut Name="dcalc"+Count; FileWriter O=new FileWriter(Name+".java"); O.write("class "+Name+" implements Calculate\n"); O.write("{public double fVonX(double x)“); O.write("{return "+Command+";}}"); O.close();

Compilieren Process p = Runtime.getRuntime() .exec("javac "+Name+".java"); System.out.println("Compilation of "+Name+" started"); p.waitFor(); String line; BufferedReader input = new BufferedReader(new InputStreamReader (p.getErrorStream())); while ((line = input.readLine()) != null) { System.out.println(line); } input.close();

Laden und instanzieren void calculate(double x) { /* Durch Einfuehrung der Funktion calculate verliert das Objekt Class X nach jeder Ausfuehrung sein Leben wird also jedesmal neu angelegt. */ try Class X=Class.forName(Name); Calculate C=(Calculate)(X.newInstance()); System.out.println("Y(x)="+C.fVonX(x)); } catch(Exception e) {System.out.println("Exception " + e);}

Der Classloader Jede Klasse wird nur einmalig geladen. Ausweg, Benutzung eines anderen Classloaders: URLClassLoader Wird mit einem Array von URLs instanziert. Erzeugte Klasse muss in einem Unterverzeichnis liegen, davon URL kreieren, damit URKClassLoader instanzieren, damit Klasse laden - fertig.

URL bauen // Get the directory (URL) of the reloadable class URL[] urls = null; try { // Convert the file object to a URL File dir = new File(System.getProperty("user.dir") +File.separator+"XFX"+File.separator); URL url = dir.toURI().toURL(); System.out.println("URL:"+url); urls = new URL[]{url}; } catch (MalformedURLException e) System.out.println(e);

Classsloader instanzieren und rechnen try { // Create a new class loader with the directory ClassLoader cl = new URLClassLoader(urls); //java.net // Load in the class Class cls = cl.loadClass("dcalc"); // Create a new instance of the new class C = (Calculate)cls.newInstance(); } catch (IllegalAccessException e) {System.out.println(e);} catch (InstantiationException e) {System.out.println(e);} catch (ClassNotFoundException e) {System.out.println(e);} System.out.println("Y="+Command); System.out.println("Y(x)=Y("+x+")="+C.fVonX(x));