Dynamische Proxy Klassen
|
|
- Edwina Geiger
- vor 8 Jahren
- Abrufe
Transkript
1 Dynamische Proxy Klassen Seminar Enterprise Computing Seminararbeit von André Markwalder, IB99 Fachhochschule Aargau Departement Technik Studiengang I Betreuender Dozent: Dr. D. Gruntz Windisch, 28. Januar 2002
2 Summary Seite 1 Der vorliegende Bericht stellt eine Einführung ins Thema der dynamischen Proxy Klassen dar. Die dynamischen Proxy Klassen bestehen grundsätzlich aus zwei Teilen, dem Proxy Design Pattern einerseits und dem JAVA Reflection API andrerseits. Der vorliegende Bericht gibt Aufschluss über die beiden Themen. Im ersten Teil wird tiefer auf das Proxy Design Pattern eingegangen. Anhand eines Beispiels wird die Verwendung dieses Patterns gezeigt. Weitere Proxy Anwendungen runden den ersten Teil ab. Der zweite Teil ist dem JAVA Reflection API gewidmet. Es wird dabei verzichtet das JAVA Reflection API im Detail zu zeigen. Vielmehr wird auf den für die dynamischen Proxy Klassen wichtigen Teil eingegangen. Es handelt sich dabei um die Proxy Klasse im Package java.lang.reflect. Der dritte und letzte Teil soll anhand eines Beispieles den Einsatz von dynamischen Proxy Klassen zeigen. Es wird dabei eine bestehende Anwendung zuerst mittels eines Proxy s, später mit einem dynamischen Proxy, erweitert. Hinweise auf weiterführende Literatur runden den Bericht ab.
3 Inhaltsverzeichnis Seite 2 Einleitung Proxy Design Pattern Motivation und Absicht Anwendung des Proxy Design Patterns Struktur und Design Java Reflection API in Bezug auf die dynamischen Proxy Klassen Was ist das Reflection API Die Packages java.lang und java.lang.reflect Das Interface InvocationHandler und die Klasse Proxy Beispiele von dynamischen Proxy Klassen Das Vehicle Beispiel Das Basisbeispiel Erweiterung mit einem Proxy Erweiterung mit einem dynamischen Proxy Erweiterung zum generischen Logger Weitere Beispiele...14 Schluss...15 A. Anhang...16 A1. Code Beispiele...16 A1.1. Vehicle Proxy Beispiel...16 A1.2. Security Proxy Beispiel...16 A1.3. Remote Proxy Beispiel...16 A1.4. Virtual Proxy Beispiel...17 A2. Bibliographie...18
4 Seite 3 Einleitung Der vorliegende Seminar Bericht richtet sich an die Studierenden des 5. und 6. Semester im Departement (Ausbildungsbereich) Technik Studiengang Informatik der FHA in Windisch. Weiter an interessierte Softwarearchitekten und Softwareentwickler. Die dynamischen Proxy Klassen umfassen im wesentlichen zwei Bereiche: Das Proxy Design Pattern einerseits und das JAVA Reflection API andrerseits. Der vorliegende Bericht beschränkt sich nicht nur auf die theoretische Erklärung der beiden Materien, sondern versucht mittels Beispielen die Umsetzung mit der Programmiersprache JAVA zu zeigen. Die richtige Verwendung von Design Patterns bedingt ein sehr gutes Verständnis der Materie und Erfahrung im Bau von Software. Der vorliegende Bericht gibt einen Überblick über das Proxy Design Pattern und dessen Umsetzung. Die JAVA Technologie Reflection wird kurz beschrieben und im Zusammenhang der dynamischen Proxy Klassen genauer erklärt. Im Bericht werden nur Codefragmente aufgelistet. Im Anhang befindet sich eine Beschreibung des gesamten Source Codes der verwendeten Beispielen.
5 Seite 4 1 Proxy Design Pattern 1.1 Motivation und Absicht Der Proxy ist ein sogenanntes Design Pattern (Muster). Diese Muster wurden entworfen um den Bau von Software zu erleichtern und erprobte Mechanismen zu formalisieren und dokumentieren. Der Proxy ist eine weitverbreitete Technik um Funktionalität von Objekten zu verbergen und ist ebenfalls unter dem Namen Surrogate (Platzhalter) bekannt. Bild 1 Der Proxy ist ein Platzhalter für ein konkretes Subjekt. Der Zugriff auf dieses Subjekt wird durch den Proxy gesteuert. Durch diese Steuerung erhält der Proxy die notwendige Fähigkeit wo, wann, wer und wie er auf das konkrete Subjekt zugreifen will/darf. Da die Aufrufe auf das konkrete Subjekt durch den Proxy gesteuert werden, verbirgt er Funktionalität vor dem Benutzer (Programmierer). Natürlich muss diese Funktionalität trotzdem programmiert werden, jedoch für die Anwendung des Subjektes, scheint der Zugriff transparent zu sein. Ein möglicher Ablauf eines Aufrufes über einen Proxy ist in Bild 1 zu sehen. Ein Grund für die Kontrolle des Zugriffs können die Initialisierungs- und Instanzierungskosten sein. An einem kleinen Beispiel kann dies gezeigt werden. Unsere Aufgabe ist es ein Textverarbeitungsprogramm bzw. einen Texteditor zu entwickeln. Dieses Textverarbeitungsprogramm soll zusätzlich Bilder anzeigen können. Bilder haben die Eigenschaft, dass sie zuerst in den Hauptspeicher geladen werden müssen und es dadurch lange dauert bis sie geladen sind. Wenn nun ein Dokument in unserem Textverarbeitungsprogramm geöffnet wird, würde bei einem schlechten Design der Software, ziemlich viel Zeit beim Laden der Bilder verbracht. Wenn man diese Problematik genauer analysiert, bemerkt man, dass die Bilder grundsätzlich gar noch nicht gebraucht werden, sondern erst wenn diese in den sichtbaren Bereich des Editors gescrollt werden. Man müsste dann die Bilder erst laden, wenn sie wirklich sichtbar werden. Diesen Mechanismus nennt man creating/loading on demand (erzeugen/laden nach Bedarf). Es gibt nun mehrere Möglichkeiten den bereits bestehenden Code zu verändern, damit wir dieses creating bzw. loading on demand bewerkstelligen können. Eine schlechte Lösung wäre, wenn wir den Ladecode anpassen. Das ist deshalb schlecht, weil wir die Funktionalität des Ladens verändern. Es gibt vielleicht Fälle in denen man dieses loading on demand nicht braucht und man müsste dann den Ladecode parametrisieren. Viel schöner wäre es, wenn wir den Code einfach durch verschiedene Instanzzierungen von Objekten parametrisierbar machen. Dies erreichen wir durch einen Decorator/Wrapper 1. Ein Beispiel für solche Decorator sind die IO Klassen in JAVA (BufferedReader, PrintWriter etc.). Der springende Punkt ist nun der, unser Decorator ist ein Platzhalter und stellt die Bildfunktionalität zur Verfügung, das Bild wird jedoch noch nicht geladen, sondern erst, wenn das Bild gezeichnet werden soll. Das heisst wenn die Methode draw 1 Der Decorator bzw. Wrapper ist ein anderes Design Pattern und wird in diesem Bericht nicht näher behandelt, da es den Umfang sprengen würde. Kurzerklärung; der Decorator delegiert alle Aufrufe, welche an ihn getätigt werden, an ein anderes Objekt.
6 Seite 5 vom Bildobjekt aufgerufen wird. Operationen wie Bild vergrössern, -verkleinern etc. werden nicht auf dem Bildobjekt ausgeführt, sondern im Decorator gespeichert, erst wenn es nötig ist, wird das Bild geladen. Bild 2 Bild 2 zeigt die Verwendung des ImageProxy. Die Attribute size und filename werden dazu verwendet, die Grösse bzw. das zu ladende Bild zu speichern. Durch diesen Mechanismus ist es möglich, das Bild erst bei Gebrauch zu laden. Das private Attribute image ist die Referenz zum Subjekt auf welchem der Proxy aufsetzt. Die Ähnlichkeit mit dem Decorator Pattern ist nicht zu übersehen. 1.2 Anwendung des Proxy Design Patterns Wie wir gesehen haben ist der Proxy ein Platzhalter Objekt und es gibt nun verschiedene Arten von Platzhaltern. Einer dieser Platzhalter ist der im vorangegangenen Kapitel angesprochene Virtual Proxy. Zu diesem Virtual Proxy gibt es den Remote Proxy, den Protection Proxy und die Smart References. Diese vier Kategorien haben sich im Laufe der Zeit herauskristallisiert und sind heute die meist verwendeten Arten von Proxies. Der Remote Proxy ist ein Platzhalter für Objekte, welche über ein Netzwerk (remote) angesprochen werden. Er versteckt bzw. macht die Funktionalität für Remote Objekte transparent. Für den Anwender bedeutet dies, er muss sich nicht darum kümmern, ob die Objekte auf seinem Computer oder auf einem anderen Computer instanziert werden. Solche Proxies spielen vor allem in verteilten Systemen eine grosse Rolle und werden da auch eingesetzt. In JAVA zum Beispiel basiert die Technologie RMI (Remote Method Invocation) auf dem Prinzip von Remote Proxies. Der virtuelle Proxy ist ein reiner Platzhalter. Wie es der Name schon sagt, ist er nur virtuell vorhanden. Er steuert den Zugriff zu lade- bzw. zeitintensiven Objekten. Der vorher erklärte Image Proxy ist ein Beispiel eines Virtual Proxy. Der Protection Proxy steuert den direkten Zugriff auf das Objekt. Er entscheidet zu Laufzeit, wer welche Methoden aufrufen darf und wem der Zugriff verwährt bleibt. Die Abstufung der Überprüfung kann selber (vom Programmierer des Proxy) gewählt werden und reicht von grob- bis feingranular. Smart References wurden erfunden um Funktionalität von Pointern zu erweitern. Sie führen zusätzliche Aufgaben beim Aufruf des Pointers aus. Beispiele dazu sind Reference Counting, laden von persistenten Objekten in den Hauptspeicher, Locking Mechanismen etc. In den vier Gruppen erkennt man die Einsatzgebiete der Proxies. Grundsätzlich kann man jeden Proxy in eine dieser vier Gruppen einteilen. Eine eindeutige Klassifikation ist jedoch nicht immer möglich und meistens auch nicht nötig. Wenn man jedoch die Einsatzgebiete von Proxies kennt, ist es einfacher Proxies in seiner eigenen Software zu integrieren.
7 1.3 Struktur und Design Seite 6 Die Struktur bzw. das Design des Proxy Design Patterns ähnelt sehr dem Decorator Pattern. Dies wurde auch schon in den vorangegangenen Kapiteln bereits erkannt. Der Proxy, wie auch der Decorator, schalten sich bei einem Aufruf zwischen Aufrufenden und Aufgerufenen. Der Unterschied dieser zwei Design Patterns liegt eigentlich nur in der Bedeutung bzw. in der Implementierung. Der Decorator delegiert alle seine Aufrufe an die entsprechende Methode des im zugrunde liegenden Objektes. Der Proxy ist da etwas freier. Je nach Verwendungszweck des Proxy kann der Aufruf zum Beispiel untersagt werden (Protection Proxy). Was beim einen (Decorator) zwingend, ist beim anderen fakultativ (Proxy). Bild 3 In Bild 3 ist die Struktur des Proxy Patterns zu erkennen. Das Interface Subject wird von beiden Klassen, RealSubject und Proxy implementiert. Das ermöglicht dem Proxy sich als Platzhalter für das RealSubject auszugeben. Da nun sämtlich Aufrufe an das RealSubject durch den Proxy getätigt werden, hat dieser natürlich volle Kontrolle über den Nachrichtenfluss. Durch diese Kontrolle ist es möglich Funktionalität für den Benutzer transparent zu handhaben. Das heisst, der Benutzer muss sich nicht um Netzhandling oder andere Funktionalität kümmern.
8 Seite 7 2 Java Reflection API in Bezug auf die dynamischen Proxy Klassen 2.1 Was ist das Reflection API Es gibt grundsätzlich zwei Wege um in JAVA Informationen über Klassen und Objekte zu erhalten. Der traditionelle, etwas beschränkte Weg ist der instance of Operator. Mit diesem Operator können Typen zu Kompilierzeit überprüft werden. Der zweite und viel mächtigere Weg ist mittels des JAVA Reflection API s. Mit dieser Sammlung von Klassen können zu Laufzeit Informationen über Objekte und Klassen gesammelt werden. Das JAVA Reflection API enthält viel Funktionalität und kann daher in die folgenden Untergruppen unterteilt werden: Dynamisches Laden von Klassen Class.forName Typenüberprüfung instance of Informationen über Klassen und Objekte Klassen Class, Method, Fields, etc. Dynamische Proxies Klasse Proxy im Package java.lang.reflect Die ersten beiden Punkte (dynamisches Laden und instance of Operator) werden nicht näher beschrieben, da sie für die dynamischen Proxy Klassen keine grosse Rolle spielen. Hingegen die Proxy Klasse bzw. der Rest des java.lang.reflect Packages sind wichtig für das Verständnis der dynamischen Proxy Klassen und werden im nächsten Kapitel näher beschrieben. 2.2 Die Packages java.lang und java.lang.reflect Wie bereits erwähnt, enthält das Package java.lang.reflect die nötigen Klassen um mittels Reflection zu Laufzeit Information über Klassen und Objekte zu sammeln. Damit dies zu Laufzeit geschehen kann, muss irgendwo ein Einstiegspunkt vorhanden sein, um diese Informationen anzufordern. Dieser Einstiegspunkt befindet sich in der Klasse Object. Jede JAVA Klasse ist vom Typ Object abgeleitet und daher ist dies der ideale Angriffspunkt für das JAVA Reflection API. Die Klasse Object enthält die Methode getclass(). Diese Methode gibt ein Objekt vom Typ Class (Package java.lang) zurück. Dieses Objekt repräsentiert das dynamische Objekt bzw. die instanzierte Klasse. Mittels verschiedener Methoden, wie z.b. getmethods() können die Methoden, welche die Klasse besitzt, herausgefunden werden. Näheres zu den verschiedenen Methoden und Klassen im Package java.lang und java.lang.reflect ist der AP I Dokumentation zu entnehmen. Ein wichtiger Bestandteil des Reflection API s und der dynamischen Proxy Klassen ist der ClassLoader. Aus diesem Grund wird er etwas detailierter beschrieben. Jede Klasse besitzt einen sogenannten ClassLoader. Dieser ClassLoader ist zuständig für das Laden der Klasse in den Speicher. Er ist im Package java.lang zu finden und kann durch die Methode <Class/Object>.getClass().getClassLoader() abgeholt werden. Der ClassLoader ist eine abstrakte Klasse und kann daher auch nicht instanziert werden. Der ClassLoader ist wichtig, da er für die später beschriebene Klasse Proxy einen wichtigen Bestandteil darstellt. Das Interface InvocationHandler und die Klasse Proxy schliessen das java.lang.reflect Package ab. Sie stellen die eigentlichen Kernkomponenten der dynamischen Proxy Klassen dar. Sie werden im nächsten Kapitel detailliert beschrieben.
9 2.3 Das Interface InvocationHandler und die Klasse Proxy Seite 8 Um dynamische Proxy Klassen zu implementieren, braucht es grundsätzlich zwei Komponenten. Einen dynamischen Handler, welcher das InvocationHandler Interface implementiert und den eigentlichen Proxy. Der Proxy ist relativ einfach zu implementieren, der existiert nämlich bereits. Es ist dies die Klasse Proxy. Von der Klasse Proxy muss man nur eine neue Instanz erzeugen und der Proxy ist bereits fertig. Um eine neue Instanz der Proxy Klasse zu erzeugen ruft man spezielle statische Methoden auf der Klasse auf. Es ist dabei zu bemerken, dass dynamische Proxy Klassen nicht auf Klassen beschränkt sind, sie können auch dynamisch ein Interface instanzieren. Anstelle eines Klassen Class Objects wird einfach ein Interface Class Object übergeben. Es folgt nun ein Beispiel, wie man eine Instanz eines Proxy erzeugen kann. Lassen sie sich nicht durch den InvocationHandler irritieren, die Erklärung was ein InvocationHandler ist folgt direkt nach dem Beispiel. Es gibt zwei Varianten eine Instanz eines dynamischen Proxy zu erzeugen. Eine erste Variante sieht folgendermassen aus: InvocationHandler handler = new MyInvocationHandler( ); Class proxyclass = Proxy.getProxyClass( Foo.class.getClassLoader(), new Class[] { Foo.class ); Foo f = (Foo) proxyclass.getconstructor( new Class[] { InvocationHandler.class ). newinstance(new Object[] { handler ); Es ist schön zu sehen wie zuerst eine Proxy Klasse erzeugt wird und danach die eigentliche Instanz der dynamischen Proxy Klasse aus dem Proxy heraus erzeugt wird. Nun diese Variante ist etwas umständlich. Das haben sich wohl auch die Entwickler gedacht und haben eine etwas einfachere Variante hinzugefügt, welche folgendermassen aussieht: InvocationHandler handler = new MyInvocationHandler( ); Foo f = (Foo) Proxy.newProxyInstance( Foo.class.getClassLoader(), new Class[] { Foo.class, handler); Grundsätzlich machen beide Varianten dasselbe, die zweite ist jedoch etwas kompakter und daher auch etwas besser zu lesen. Als erster Parameter erhält die Funktion newproxyinstance einen ClassLoader. Im vorangegangenen Kapitel wurde der ClassLoader erklärt. Er wird hier gebraucht um die Klasse, welche gewrappt wird zu laden. Als zweiten Parameter erhält die Funktion ein Array von Class Objekten. Das sind die Interfaces bzw. Klassen welche implementiert werden. Als letzten Parameter erhält die Funktion den InvocationHandler, welcher später beschrieben wird. Da der Proxy diverse Interfaces dynamisch implementiert, kann das Object, welches zurückgegeben wird auch ohne Probleme in ein solches gecastet werden. Es war nun immer die Rede eines Invocation Handlers. Mittels diesem Handler kann der Programmierer Einfluss auf das Verhalten des Proxy nehmen. Hier geschieht die Implementation des Proxy z.b. die Implementation der Remote Funktionalität für einen Remote Proxy oder die Sicherheitsfunktionalität eines Security Proxy. Die Implementation eines Invocation Handlers ist einfach. Der Handler implementiert das Interface InvocationHandler, dadurch muss er die Funktion invoke(object proxy, Method method, Object[] args) implementieren. Als ersten Parameter erhält die
10 Seite 9 Funktion den Proxy, welcher die invoke Methode aufgerufen hat. Als zweiten Parameter bekommt er die aufgerufene Methode auf dem Objekt. Als dritten Parameter werden die Argumente geliefert. Method1() Client Method2() Method3() Target Bild 4 Bild 4 zeigt ein Problem, welches mit einem dynamischen Proxy modeliert werden könnte, falls die Anforderung käme, man müsse gewisse Funktionalität zwischen Client und Target einbauen, z.b. sämtliche Aufrufe auf dem Target müssten geloggt werden oder es müsse ein Security Konzept implementiert werden, dass nicht jederman Funktionen ausführen darf. Method1() Method1() Method2() Method2() Client Proxy Target Method3() Method3() Bild 5 Bild 5 zeigt die Implementation mit einem normalen Proxy. Der Proxy empfängt den Methodenaufruf, tätigt seine Arbeit und ruft dann die Methode auf dem Target auf. Man sieht hier bereits einen riesen Nachteil eines normalen Proxies. Sämtlich Methodenaufrufe müssen implementiert werden, d.h. wenn eine neue Methode auf dem Target hinzu kommt, dann muss diese ebenfalls auf dem Proxy implementiert werden. Method1() Client Method2() Method3() Proxy invoke() Invocation Handler invoke() Target Bild 6 In Bild 6 ist der Ablauf eines dynamischen Proxy Aufrufs dargestellt. Im ersten Schritt wird auf dem Proxy die Methode 1, 2 oder 3 aufgerufen. Damit dies möglich ist, muss der Proxy das Target Interface implementieren. Der Proxy leitet nun die Anfrage an den Invocation Handler weiter. Dies geschieht mit dem Reflection API von JAVA. Der Invocation Handler entscheidet nun was mit dem Aufruf geschehen soll. Je nach Implementation leitet er den Aufruf weiter, bricht ihn ab oder macht sonst irgendwas. Diese Implementation ist dem Programmierer überlassen. Meistens verwendet der Invocation Handler ebenfalls das Reflection API von JAVA, um den Aufruf zu tätigen. Aus dem Bild ist ebenfalls ersichtlich, dass der Invocation Handler das Target kennen muss, da er Funktionen auf diesem Target ausführen möchte. Wenn nun das Target Interface ändert, muss nicht unbedingt die Implementation des Proxy geändert werden.
11 Seite 10 3 Beispiele von dynamischen Proxy Klassen 3.1 Das Vehicle Beispiel Das Basisbeispiel Im letzten Kapitel haben wir ganz generell eine Applikation schrittweise mit einem Proxy und dann mit einem dynamischen Proxy erweitert. Dies wollen wir nun ebenfalls tun an einem konkreten Beispiel. Das konkrete Beispiele ist ein Vehicle. Dieses Vehicle wird durch einen Client bedient. Dazu werden zwei Klassen und ein Interface benötigt. Das Interface IVehicle sieht folgendermassen aus: public interface IVehicle { public void start(); public void stop(); public void forward(); public void reverse(); public String getname(); Die Implementation des Vehicles macht nichts anderes als die aufgerufene Methode auszugeben. Das Vehicle implementiert natürlich das IVehicle Interface. Die Implementation Car sieht folgendermassen aus: public class Car implements IVehicle { private String name; public Car(String name) {this.name=name; public void start() { System.out.println("Car " + name + " started"); public void stop() { public void forward() { public void reverse() { public String getname() { Der Client macht nun nichts anderes als Car zu instanzieren und die verschiedenen Methoden aufzurufen. Die Client Implementation sieht folgendermassen aus: public class Client { public static void main(string[] args) { new Client();
12 public Client() { IVehicle v = new Car("Audi RS4"); v.start(); v.forward(); v.stop(); Seite 11 Dieses Programm soll nun mit einem Proxy erweitert werden. Die Stärke des Proxy liegt darin, bestehende Funktionalität zu erweitern. Wir wollen nun das Vehicle dahin erweitern, dass jede Funktion auf der Konsole ausgegeben wird. Schlussendlich soll ein generischer Logger entstehen, welcher unabhängig von der Implementation und Interface sämtliche Aufrufe auf die Konsole schreibt Erweiterung mit einem Proxy In einem ersten Schritt erweitern wir das Basisbeispiel mit einem Proxy. Das verwendete Interface bleibt sich gleich. Ebenfalls die Vehicle Klasse, wir wollen die bestehende Funktionalität erweitern. Eine neue Klasse ist die VehicleProxy Klasse. Diese Klasse stellt den Proxy dar. Sie sieht folgendermassen aus: public class VehicleProxy implements IVehicle { private IVehicle v; public VehicleProxy(IVehicle v) { this.v=v; public void start() { System.out.println("VehicleProxy: Begin of start()"); v.start(); System.out.println("VehicleProxy: End of start()"); public void stop() { public void forward() { public void reverse() { public String getname() { Wie wir in den ersten Kapiteln gesehen haben, besitzt der Proxy eine Referenz auf das reale Subjekt. In unserem Fall ist dies das eigentliche Vehicle (Car Objekt). Dieses Vehicle wird in den Konstruktor übergeben. Bei diesem Codesegment ist sehr schön der grosse Nachteil des Proxy zu sehen. Alle Methoden müssen an das Subjekt delegiert werden und müssen daher auch implementiert werden. Bei einer Änderung am Interface muss nicht nur die konkrete Implementierung der Funktionalität geändert werden, sondern auch der Proxy, was ein bisschen mühsam ist. Weitere Änderungen gibt es auf dem Client, denn da muss natürlich der Proxy instanziert werden und die Aufrufe müssen auf diesem Proxy Objekt getätigt werden. Der Client Code sieht folgendermassen aus:
13 public class Client { public static void main(string[] args) { new Client(); public Client() { IVehicle c = new Car("Audi RS4"); IVehicle v = new VehicleProxy(c); v.start(); v.forward(); v.stop(); Seite 12 Bei diesem Codesegment ist schön zu sehen, wie das reale Subjekt (Car) instanziert wird und an den Proxy weitergeleitet wird Erweiterung mit einem dynamischen Proxy Beim dynamischen Proxy muss ebenfalls nur der Proxy (InvocationHandler VehicleHandler) und der Client angepasst werden, der Rest bleibt unverändert. Der Code des InvocationHandler bzw. des VehicleHandler sieht folgendermassen aus: public class VehicleHandler implements InvocationHandler { private IVehicle target; public VehicleHandler(IVehicle target) { this.target=target; public Object invoke(object proxy, Method m, Object[] args) throws Throwable { System.out.println("VH: Invoking " + m.getname()); return m.invoke(target,args); In diesem Handler muss nun nicht mehr jede Methode implementiert werden, da das JAVA Reflection API verwendet wird. Gleich wie beim Proxy muss aber das target bzw. destination Objekt übergeben werden (Konstruktor). In der Methode invoke muss nun nur noch die Ausgabe auf die Konsole erfolgen und die aufgerufene Methode an das Target weitergeleitet werden. Der Client erfährt ebenfalls eine kleine Änderung, in etwa die gleich wie bei der Verwendung des normanlen Proxy. Der Client Code sieht folgendermassen aus: public class Client { public static void main(string[] args) {
14 new Client(); public Client() { IVehicle c = new Car("Audi RS4"); IVehicle v = (IVehicle)Proxy.newProxyInstance( IVehicle.class.getClassLoader(), new Class[] {IVehicle.class, new VehicleHandler(c) ); v.start(); v.forward(); v.stop(); Seite 13 Mit dem bekannten instanzieren des Proxy aus Kapitel 2 wird nun der Proxy und VehicleHandler erzeugt. Zu erwähnen ist auch das casten des Proxy auf das IVehicle Interface. Danach können die Aufrufe ganz normal getätigt werden Erweiterung zum generischen Logger Die Erweiterung zu einem generischen Logger ist sehr einfach. Der VehicleHandler besitzt momentan eine Referenz auf das IVehicle Interface. Grundsätzlich kann dies natürlich irgend eine Referenz sein. Für einen generischen Logger bietet sich natürlich die Klasse Object an. Somit würde der generische Logger folgendermassen aussehen: public class GenericLogger implements InvocationHandler { private Object target; public GenericLogger(Object target) { this.target=target; public Object invoke(object proxy, Method m, Object[] args) throws Throwable { System.out.println("GL: Invoking " + m.getname()); return m.invoke(target,args); Der Client entspricht dem Client für den dynamischen Proxy. Dieser generische Logger kann nun für irgendeinen Client verwendet werden. In den beigelegten Beispielen sind diese Logger zu sehen (CarClient und PetLogger).
15 3.2 Weitere Beispiele Seite 14 In den vorangegangenen Abschnitten haben wir die Implementation bzw. das Weiterentwickeln eines dynamischen Proxy gesehen. Im ersten Kapitel haben wir gesehen, dass es noch weitere Arten von Proxies gibt. Im Anhang bzw. im beigelegten Sourcecode sind weitere Beispiele enthalten, welche die Verwendung von Proxies darstellen. Im Prinzip funktionieren diese aber genau gleich wie das Vehicle Beispiel, behandeln aber eine andere Thematik. Die folgenden Thematiken wurden gewählt: Security Proxy Remote Proxy Virtual Proxy Dies entspricht den momentan gängigen Implementation von Proxies. Wie man die Beispiele verwendet, kann dem Anhang entnommen werden.
16 Seite 15 Schluss Das Proxy Design Pattern wurde entworfen um spezielle Funktionalität vom Benutzer zu verbergen. Eine andere Aufgabe des Patterns kann sein, bestehende Funktionalität zu erweitern. Typische Proxies sind: Virtual Proxy, Remote Proxy, Protection Proxy und Smart References. Das Proxy Design Pattern wird auch Surrogate genannt. Das JAVA Reflection API ist eine Spracherweiterung für JAVA, welche es dem Entwickler erlaubt, zu Laufzeit dynamisch Objekte zu erzeugen. Dies ist aber nicht die einzige Aufgabe des Reflection API, denn es stellt zusätzlich Informationsbehälter zur Verfügung, welche Informationen über Klassen und Objekte enthalten. Wenn man nun die beiden Thematiken mischt, erhält man die dynamischen Proxy Klassen. Man nimmt das Design Pattern Proxy und das dynamische Aufrufen von Methoden und es kommen die dynamischen Proxy Klassen zum Vorschein. Dynamische Proxy Klassen werden mit der Klasse Proxy aus dem java.lang.reflect Package erzeugt. Es werden dabei dynamisch Interfaces implementiert. Diese Interfaces können auch wieder ausgewechselt werden. Dies hat den Vorteil, dass sämtlich Operationen auf dem Proxy typengeprüft sind. Dynamische Proxy Klassen eignen sich hervorragend um bestehende Funktionalität zu erweitern. Man darf jedoch nie das Konzept der dynamischen Proxy Klassen aus dem Auge verlieren. Das Problem der dynamischen Proxy Klassen besteht darin, dass es meistens einfacher ist, die Anforderungen an die Software anzupassen, damit man die dynamischen Proxy Klassen verwenden kann. Diese sollte jedoch auf keinen Fall geschehen. Damit diese nicht passiert, muss man das Konzept, welches hinter den dynamischen Proxy Klassen steht, vollkommen verstanden haben. Die dynamischen Proxy Klassen sind ein tolles und elegantes Werkzeug in der modernen Softwareentwicklung. Ein gezielter und gut überlegter Einsatz sind jedoch Bedingung, damit der Einsatz von dynamischen Proxy Klassen zum Erfolg führt.
17 Seite 16 A. Anhang A1. Code Beispiele Die Beispiele sind im JAR Archiv DynamicProxyClasses.jar zu finden. In diesem JAR Archiv sind der Source Code, wie auch die lauffähigen Programme zu finden. Die folgenden Beispiele sind die meistgebrauchten Arten von Proxies. A1.1. Vehicle Proxy Beispiel Das Vehicle Proxy Beispiel besteht aus mehreren JAVA Programmen, welche in Packages strukturiert bzw. enthalten sind. Es sind dies folgende Programme bzw. Packages: dpc.vehicleexample.client Basis Funktionalität dp.vehicleexample.proxy.standard.client Proxy Implementation des Vehicle Beispiels dpc.vehicleexample.proxy.dynamic.client Dynamische Proxy Implementation des Vehicle Beispiels dpc.vehicleexample.logger.decorator.client Decorator Implementation eines Loggers dpc.vehicleexample.logger.generic.carclient Generische Logger Implementation des Vehicle Beispiels dpc.vehicleexample.logger.generic.petclient Generische Logger Implementation des Pet Beispiels (gleicher Logger wie im Vehicle Beispiel) Anhand dieser Beispiele kann die Verwendung von Dynamischen Proxy Klassen gezeigt werden. Die Beispiele bauen aufeinander auf und mit dem generischen Logger ist das Endprodukt zu sehen. A1.2. Security Proxy Beispiel Nachdem am Vehicle Beispiel die Verwendung der dynamischen Proxy Klassen zu sehen war, wird in den nächsten Beispielen spezielle Arten von Proxies betrachtet. Mit dem Security Proxy wird eine Zugriffssteuerung auf eine sogenannte View gezeigt. Die Security Mechanismen sind auf Methoden Ebene implementiert. Zu startende Klasse: dpc.securityexample.client A1.3. Remote Proxy Beispiel Das Remote Proxy Beispiel zeigt eine Implementation eines Socket Servers. Durch den Proxy wird der Zugriff transparent. Der Socket Server ist ein sogenannter Echo Server. Dieser Echo Server antwortet immer mit dem eingegangenen Aufruf. Zu startende Klasse: dpc.remoteexample.client
18 A1.4. Virtual Proxy Beispiel Seite 17 Das Virutal Proxy Beispiel zeigt eine Implementation des Grafik Beispiels vom ersten Kapitel. Das Laden der Grafik wird nur simuliert. Das Prinzip des Virtual Proxy ist aber ersichtlich. Zu startende Klasse: dpc.virtualexample.client
19 Seite 18 A2. Bibliographie Blosser, Jeremy (2001). Explore the Dynamic Proxy API. Stand Blosser, Jeremy (2001) Java Tip 98: Reflect on the Visitor design pattern. Stand Gamma, Erich; Helm, Richard; Johnson Ralph; Vlissides, John (1995). Design Patterns - Elements of Reusable Object-Oriented Software. 20., Boston u.a.: Addison-Wesley Halloway, Stuart (2001) Dynamic Proxies. ftp://ftp.ora.com/pub/conference/java2001/halloway_dynamic_proxies.zip Stand Jung, Christoph G. (2001) Dynamic Proxies. Stand Lavers, Tim (2001) Java Tip 108: Apply RMI autogeneration. Stand Portwood, Michael T. (2001) Using Java Technology Reflection to Improve Design. Stand Sun Microsystems, Inc. (2001) Dynamic Proxy Classes. Stand Sun Microsystems, Inc. (2001) Using dynamic proxies to layer new functionality over existing code. Stand Sun Microsystems, Inc. (2001) Using java.lang.reflect.proxy to Interpose on Java Class Methods. Stand Tarr, Bob (2001) Dynamic Proxies in Java. Stand
Anleitung über den Umgang mit Schildern
Anleitung über den Umgang mit Schildern -Vorwort -Wo bekommt man Schilder? -Wo und wie speichert man die Schilder? -Wie füge ich die Schilder in meinen Track ein? -Welche Bauteile kann man noch für Schilder
MehrObjektorientierte Programmierung
Objektorientierte Programmierung 1 Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum
MehrFactory Method (Virtual Constructor)
Factory Method (Virtual Constructor) Zweck: Definition einer Schnittstelle für Objekterzeugung Anwendungsgebiete: Klasse neuer Objekte bei Objekterzeugung unbekannt Unterklassen sollen Klasse neuer Objekte
MehrJava: Vererbung. Teil 3: super() www.informatikzentrale.de
Java: Vererbung Teil 3: super() Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und IMMER zuerst den Konstruktor der Elternklasse auf! Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und
MehrEinführung in die Programmierung
Technische Universität München WS 2003/2004 Institut für Informatik Prof. Dr. Christoph Zenger Testklausur Einführung in die Programmierung Probeklausur Java (Lösungsvorschlag) 1 Die Klasse ArrayList In
MehrDaniel Warneke warneke@upb.de 08.05.2006. Ein Vortrag im Rahmen des Proseminars Software Pioneers
Design Patterns Daniel Warneke warneke@upb.de 08.05.2006 Ein Vortrag im Rahmen des Proseminars Software Pioneers Design Patterns 1/23 Übersicht Einleitung / Motivation Design Patterns Beispiele Rolle des
MehrObjektorientierte Programmierung für Anfänger am Beispiel PHP
Objektorientierte Programmierung für Anfänger am Beispiel PHP Johannes Mittendorfer http://jmittendorfer.hostingsociety.com 19. August 2012 Abstract Dieses Dokument soll die Vorteile der objektorientierten
MehrSpeicher in der Cloud
Speicher in der Cloud Kostenbremse, Sicherheitsrisiko oder Basis für die unternehmensweite Kollaboration? von Cornelius Höchel-Winter 2013 ComConsult Research GmbH, Aachen 3 SYNCHRONISATION TEUFELSZEUG
MehrProfessionelle Seminare im Bereich MS-Office
Der Name BEREICH.VERSCHIEBEN() ist etwas unglücklich gewählt. Man kann mit der Funktion Bereiche zwar verschieben, man kann Bereiche aber auch verkleinern oder vergrößern. Besser wäre es, die Funktion
MehrEinführung in die Java- Programmierung
Einführung in die Java- Programmierung Dr. Volker Riediger Tassilo Horn riediger horn@uni-koblenz.de WiSe 2012/13 1 Wichtig... Mittags keine Pommes... Praktikum A 230 C 207 (Madeleine + Esma) F 112 F 113
MehrIst Fernsehen schädlich für die eigene Meinung oder fördert es unabhängig zu denken?
UErörterung zu dem Thema Ist Fernsehen schädlich für die eigene Meinung oder fördert es unabhängig zu denken? 2000 by christoph hoffmann Seite I Gliederung 1. In zu großen Mengen ist alles schädlich. 2.
MehrLineargleichungssysteme: Additions-/ Subtraktionsverfahren
Lineargleichungssysteme: Additions-/ Subtraktionsverfahren W. Kippels 22. Februar 2014 Inhaltsverzeichnis 1 Einleitung 2 2 Lineargleichungssysteme zweiten Grades 2 3 Lineargleichungssysteme höheren als
MehrProjektmanagement in der Spieleentwicklung
Projektmanagement in der Spieleentwicklung Inhalt 1. Warum brauche ich ein Projekt-Management? 2. Die Charaktere des Projektmanagement - Mastermind - Producer - Projektleiter 3. Schnittstellen definieren
MehrVersion smarter mobile(zu finden unter Einstellungen, Siehe Bild) : Gerät/Typ(z.B. Panasonic Toughbook, Ipad Air, Handy Samsung S1):
Supportanfrage ESN Bitte füllen Sie zu jeder Supportanfrage diese Vorlage aus. Sie helfen uns damit, Ihre Anfrage kompetent und schnell beantworten zu können. Verwenden Sie für jedes einzelne Thema jeweils
MehrMenü auf zwei Module verteilt (Joomla 3.4.0)
Menü auf zwei Module verteilt (Joomla 3.4.0) Oft wird bei Joomla das Menü in einem Modul dargestellt, wenn Sie aber z.b. ein horizontales Hauptmenü mit einem vertikalen Untermenü machen möchten, dann finden
MehrDer lokale und verteilte Fall
Lokale Beans Der lokale und verteilte Fall RemoteClient Lokaler Client (JSP) RemoteSession/Entity-Bean Lokale Session/Entity-Bean 2 Lokale Beans Die bisher vorgestellten EJBswaren immer in der Lage auf
MehrAnton Ochsenkühn. amac BUCH VERLAG. Ecxel 2016. für Mac. amac-buch Verlag
Anton Ochsenkühn amac BUCH VERLAG Ecxel 2016 für Mac amac-buch Verlag 2 Word-Dokumentenkatalog! Zudem können unterhalb von Neu noch Zuletzt verwendet eingeblendet werden. Damit hat der Anwender einen sehr
MehrMusterlösung zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 9
Prof. Dr. Wilhelm Schäfer Paderborn, 15. Dezember 2014 Christian Brenner Tristan Wittgen Musterlösung zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 9 Aufgabe 1 Codegenerierung
MehrDokumentenverwaltung im Internet
Dokumentenverwaltung im Internet WS 09/10 mit: Thema: Workflow und Rollenverteilung im Backend Gruppe: DVI 10 Patrick Plaum und Kay Hofmann Inhalt 1. Benutzer und Benutzergruppen erstellen...2 1.1. Benutzergruppen...2
MehrHandbuch Fischertechnik-Einzelteiltabelle V3.7.3
Handbuch Fischertechnik-Einzelteiltabelle V3.7.3 von Markus Mack Stand: Samstag, 17. April 2004 Inhaltsverzeichnis 1. Systemvorraussetzungen...3 2. Installation und Start...3 3. Anpassen der Tabelle...3
MehrGroße Übung Praktische Informatik 1
Große Übung Praktische Informatik 1 2005-12-08 fuessler@informatik.uni-mannheim.de http://www.informatik.uni-mannheim.de/pi4/people/fuessler 1: Announcements / Orga Weihnachtsklausur zählt als Übungsblatt,
MehrL10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016
L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016 Referentin: Dr. Kelly Neudorfer Universität Hohenheim Was wir jetzt besprechen werden ist eine Frage, mit denen viele
MehrJava Reflection. Meta-Programmierung mit der java.lang.reflection API. Prof. Dr. Nikolaus Wulff
Java Reflection Meta-Programmierung mit der java.lang.reflection API. Prof. Dr. Nikolaus Wulff Java Reflection Die Java Reflection API liefert per Introspection Informationen über Klassen => Meta-Daten.
MehrPrimzahlen und RSA-Verschlüsselung
Primzahlen und RSA-Verschlüsselung Michael Fütterer und Jonathan Zachhuber 1 Einiges zu Primzahlen Ein paar Definitionen: Wir bezeichnen mit Z die Menge der positiven und negativen ganzen Zahlen, also
Mehr1 Mathematische Grundlagen
Mathematische Grundlagen - 1-1 Mathematische Grundlagen Der Begriff der Menge ist einer der grundlegenden Begriffe in der Mathematik. Mengen dienen dazu, Dinge oder Objekte zu einer Einheit zusammenzufassen.
MehrArbeiten mit UMLed und Delphi
Arbeiten mit UMLed und Delphi Diese Anleitung soll zeigen, wie man Klassen mit dem UML ( Unified Modeling Language ) Editor UMLed erstellt, in Delphi exportiert und dort so einbindet, dass diese (bis auf
MehrZählen von Objekten einer bestimmten Klasse
Zählen von Objekten einer bestimmten Klasse Ziel, Inhalt Zur Übung versuchen wir eine Klasse zu schreiben, mit der es möglich ist Objekte einer bestimmten Klasse zu zählen. Wir werden den ++ und den --
MehrInformationen zum neuen Studmail häufige Fragen
1 Stand: 15.01.2013 Informationen zum neuen Studmail häufige Fragen (Dokument wird bei Bedarf laufend erweitert) Problem: Einloggen funktioniert, aber der Browser lädt dann ewig und zeigt nichts an Lösung:
MehrGrundlagen der Theoretischen Informatik, SoSe 2008
1. Aufgabenblatt zur Vorlesung Grundlagen der Theoretischen Informatik, SoSe 2008 (Dr. Frank Hoffmann) Lösung von Manuel Jain und Benjamin Bortfeldt Aufgabe 2 Zustandsdiagramme (6 Punkte, wird korrigiert)
MehrBereich METIS (Texte im Internet) Zählmarkenrecherche
Bereich METIS (Texte im Internet) Zählmarkenrecherche Über die Zählmarkenrecherche kann man nach der Eingabe des Privaten Identifikationscodes einer bestimmten Zählmarke, 1. Informationen zu dieser Zählmarke
MehrHandbuch für Redakteure
Handbuch für Redakteure Erste Schritte... 1 Artikel erstellen... 2 Artikelinhalt bearbeiten... 3 Artikel bearbeiten... 3 Grunddaten ändern... 5 Weitere Artikeleigenschaften... 5 Der WYSIWYG-Editor... 6
MehrSynchronisations- Assistent
TimePunch Synchronisations- Assistent Benutzerhandbuch Gerhard Stephan Softwareentwicklung -und Vertrieb 25.08.2011 Dokumenten Information: Dokumenten-Name Benutzerhandbuch, Synchronisations-Assistent
Mehr4 Aufzählungen und Listen erstellen
4 4 Aufzählungen und Listen erstellen Beim Strukturieren von Dokumenten und Inhalten stellen Listen und Aufzählungen wichtige Werkzeuge dar. Mit ihnen lässt sich so ziemlich alles sortieren, was auf einer
MehrEine eigene Seite auf Facebook-Fanseiten einbinden und mit einem Tab verbinden.
Eine eigene Seite auf Facebook-Fanseiten einbinden und mit einem Tab verbinden. Nach den Änderungen die Facebook vorgenommen hat ist es einfacher und auch schwerer geworden eigene Seiten einzubinden und
MehrProgramme im Griff Was bringt Ihnen dieses Kapitel?
3-8272-5838-3 Windows Me 2 Programme im Griff Was bringt Ihnen dieses Kapitel? Wenn Sie unter Windows arbeiten (z.b. einen Brief schreiben, etwas ausdrucken oder ein Fenster öffnen), steckt letztendlich
MehrGEVITAS Farben-Reaktionstest
GEVITAS Farben-Reaktionstest GEVITAS Farben-Reaktionstest Inhalt 1. Allgemeines... 1 2. Funktionsweise der Tests... 2 3. Die Ruhetaste und die Auslösetaste... 2 4. Starten der App Hauptmenü... 3 5. Auswahl
MehrWebalizer HOWTO. Stand: 18.06.2012
Webalizer HOWTO Stand: 18.06.2012 Copyright 2003 by manitu. Alle Rechte vorbehalten. Alle verwendeten Bezeichnungen dienen lediglich der Kennzeichnung und können z.t. eingetragene Warenzeichen sein, ohne
MehrFAQ 04/2015. Auswirkung der ISO 14119 auf 3SE53/3SF13 Positionsschalter. https://support.industry.siemens.com/cs/ww/de/view/109475921
FAQ 04/2015 Auswirkung der ISO 14119 auf 3SE53/3SF13 Positionsschalter mit https://support.industry.siemens.com/cs/ww/de/view/109475921 Dieser Beitrag stammt aus dem Siemens Industry Online Support. Es
MehrApplet Firewall und Freigabe der Objekte
Hauptseminar Applet Firewall und Freigabe der Objekte Nachweis von Sicherheitseigenschaften für JavaCard Jin Zhou Ein Überblick über diesen Vortrag Applet Firewall Kontext JCRE Entry Point Objekt Shareable
MehrInformationsblatt Induktionsbeweis
Sommer 015 Informationsblatt Induktionsbeweis 31. März 015 Motivation Die vollständige Induktion ist ein wichtiges Beweisverfahren in der Informatik. Sie wird häufig dazu gebraucht, um mathematische Formeln
MehrHinweise in Leichter Sprache zum Vertrag über das Betreute Wohnen
Hinweise in Leichter Sprache zum Vertrag über das Betreute Wohnen Sie möchten im Betreuten Wohnen leben. Dafür müssen Sie einen Vertrag abschließen. Und Sie müssen den Vertrag unterschreiben. Das steht
MehrProgrammieren in Java
Programmieren in Java objektorientierte Programmierung 2 2 Zusammenhang Klasse-Datei In jeder *.java Datei kann es genau eine public-klasse geben wobei Klassen- und Dateiname übereinstimmen. Es können
Mehr1 topologisches Sortieren
Wolfgang Hönig / Andreas Ecke WS 09/0 topologisches Sortieren. Überblick. Solange noch Knoten vorhanden: a) Suche Knoten v, zu dem keine Kante führt (Falls nicht vorhanden keine topologische Sortierung
MehrHandbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: 24.09.2014)
Handbuch NAFI Online-Spezial 1. Auflage (Stand: 24.09.2014) Copyright 2016 by NAFI GmbH Unerlaubte Vervielfältigungen sind untersagt! Inhaltsangabe Einleitung... 3 Kundenauswahl... 3 Kunde hinzufügen...
MehrÜbung: Verwendung von Java-Threads
Übung: Verwendung von Java-Threads Ziel der Übung: Diese Übung dient dazu, den Umgang mit Threads in der Programmiersprache Java kennenzulernen. Ein einfaches Java-Programm, das Threads nutzt, soll zum
Mehrhttp://train-the-trainer.fh-joanneum.at IINFO Storyboard
IINFO Storyboard Allgemeine Bemerkungen und Richtlinien zur Handhabung. Das Storyboard besteht aus einem Web, d.h. einer vernetzten Struktur von HTML-Seiten welche später von den Programmieren direkt als
MehrDas sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert
Beamen in EEP Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert Zuerst musst du dir 2 Programme besorgen und zwar: Albert, das
Mehraffilinet_ Flash-Spezifikationen
affilinet_ Flash-Spezifikationen Inhaltsverzeichnis Allgemeines...2 Klickzählung...2 Lead/Sale Programme... 2 PPC und Kombi Programme...3 Übergabe von Formulardaten...4 clicktag Variante Sale/Lead Programm...4
MehrLeseprobe. Bruno Augustoni. Professionell präsentieren. ISBN (Buch): 978-3-446-44285-6. ISBN (E-Book): 978-3-446-44335-8
Leseprobe Bruno Augustoni Professionell präsentieren ISBN (Buch): 978-3-446-44285-6 ISBN (E-Book): 978-3-446-44335-8 Weitere Informationen oder Bestellungen unter http://wwwhanser-fachbuchde/978-3-446-44285-6
MehrJava Kurs für Anfänger Einheit 4 Klassen und Objekte
Java Kurs für Anfänger Einheit 4 Klassen und Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 13. Juni 2009 Inhaltsverzeichnis klasse
MehrLernerfolge sichern - Ein wichtiger Beitrag zu mehr Motivation
Lernerfolge sichern - Ein wichtiger Beitrag zu mehr Motivation Einführung Mit welchen Erwartungen gehen Jugendliche eigentlich in ihre Ausbildung? Wir haben zu dieser Frage einmal die Meinungen von Auszubildenden
MehrDieses Tutorial gibt eine Übersicht der Form Klassen von Struts, welche Besonderheiten und Unterschiede diese aufweisen.
Übersicht Struts Forms Dieses Tutorial gibt eine Übersicht der Form Klassen von Struts, welche Besonderheiten und Unterschiede diese aufweisen. Allgemeines Autor: Sascha Wolski http://www.laliluna.de/tutorials.html
MehrMenü Macro. WinIBW2-Macros unter Windows7? Macros aufnehmen
Menü Macro WinIBW2-Macros unter Windows7?... 1 Macros aufnehmen... 1 Menübefehle und Schaltflächen in Macros verwenden... 4 Macros bearbeiten... 4 Macros löschen... 5 Macro-Dateien... 5 Macros importieren...
MehrJederzeit Ordnung halten
Kapitel Jederzeit Ordnung halten 6 auf Ihrem Mac In diesem Buch war bereits einige Male vom Finder die Rede. Dieses Kapitel wird sich nun ausführlich diesem so wichtigen Programm widmen. Sie werden das
MehrDas Festkomitee hat die Abi-Seite neu konzipiert, die nun auf einem (gemieteten) Share Point Server
Hallo Leute Das Festkomitee hat die Abi-Seite neu konzipiert, die nun auf einem (gemieteten) Share Point Server (= echtes - zeug ) liegt! Die neue Form hat insbesondere folgende Vorteile: Du bekommst einen
MehrGutes Leben was ist das?
Lukas Bayer Jahrgangsstufe 12 Im Hirschgarten 1 67435 Neustadt Kurfürst-Ruprecht-Gymnasium Landwehrstraße22 67433 Neustadt a. d. Weinstraße Gutes Leben was ist das? Gutes Leben für alle was genau ist das
MehrObjectBridge Java Edition
ObjectBridge Java Edition Als Bestandteil von SCORE Integration Suite stellt ObjectBridge Java Edition eine Verbindung von einem objektorientierten Java-Client zu einer fast beliebigen Server-Komponente
MehrWir arbeiten mit Zufallszahlen
Abb. 1: Bei Kartenspielen müssen zu Beginn die Karten zufällig ausgeteilt werden. Wir arbeiten mit Zufallszahlen Jedesmal wenn ein neues Patience-Spiel gestartet wird, muss das Computerprogramm die Karten
MehrWebService in Java SE und EE
Schlüsselworte Java, JAX-WS, JAX-RS, JAXB, XML. Einleitung WebService in Java SE und EE Wolfgang Nast MT AG Ratingen Es werden die Mölichkeiten von WebServices in Java SE und EE, mit SOAP und REST gezeigt.
MehrNicht kopieren. Der neue Report von: Stefan Ploberger. 1. Ausgabe 2003
Nicht kopieren Der neue Report von: Stefan Ploberger 1. Ausgabe 2003 Herausgeber: Verlag Ploberger & Partner 2003 by: Stefan Ploberger Verlag Ploberger & Partner, Postfach 11 46, D-82065 Baierbrunn Tel.
MehrBinäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen
Binäre Bäume 1. Allgemeines Binäre Bäume werden grundsätzlich verwendet, um Zahlen der Größe nach, oder Wörter dem Alphabet nach zu sortieren. Dem einfacheren Verständnis zu Liebe werde ich mich hier besonders
MehrPersönliche Zukunftsplanung mit Menschen, denen nicht zugetraut wird, dass sie für sich selbst sprechen können Von Susanne Göbel und Josef Ströbl
Persönliche Zukunftsplanung mit Menschen, denen nicht zugetraut Von Susanne Göbel und Josef Ströbl Die Ideen der Persönlichen Zukunftsplanung stammen aus Nordamerika. Dort werden Zukunftsplanungen schon
MehrNutzung von GiS BasePac 8 im Netzwerk
Allgemeines Grundsätzlich kann das GiS BasePac Programm in allen Netzwerken eingesetzt werden, die Verbindungen als Laufwerk zu lassen (alle WINDOWS Versionen). Die GiS Software unterstützt nur den Zugriff
Mehr10 Erweiterung und Portierung
10.1 Überblick In vielen Fällen werden Compiler nicht vollständig neu geschrieben, sondern von einem Rechnersystem auf ein anderes portiert. Das spart viel Arbeit, ist aber immer noch eine sehr anspruchsvolle
MehrGruppenrichtlinien und Softwareverteilung
Gruppenrichtlinien und Softwareverteilung Ergänzungen zur Musterlösung Bitte lesen Sie zuerst die gesamte Anleitung durch! Vorbemerkung: Die Begriffe OU (Organizational Unit) und Raum werden in der folgenden
MehrDoku zur Gebäudebrüter Datenbank
Autor: Christina Baradari, christina.baradari@berlin.de, 0162 2008 114 Doku zur Gebäudebrüter Datenbank Team Web Programmierer: Rahim Baradari Inhaltsverzeichnis 1 Suchen nach Kartierungsdaten... 2 1.1
MehrStatuten in leichter Sprache
Statuten in leichter Sprache Zweck vom Verein Artikel 1: Zivil-Gesetz-Buch Es gibt einen Verein der selbstbestimmung.ch heisst. Der Verein ist so aufgebaut, wie es im Zivil-Gesetz-Buch steht. Im Zivil-Gesetz-Buch
MehrFAQ Spielvorbereitung Startspieler: Wer ist Startspieler?
FAQ Spielvorbereitung Startspieler: Wer ist Startspieler? In der gedruckten Version der Spielregeln steht: der Startspieler ist der Spieler, dessen Arena unmittelbar links neben dem Kaiser steht [im Uhrzeigersinn].
MehrProblemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.
Universität Osnabrück 1 Problemstellung 3 - Objektorientierte Programmierung in Java Vorlesung 24: Reflection 1 SS 2006 Prof. Dr. Frank M. Thiesing, FH Osnabrück Um ein Objekt anzulegen, eine seiner Methoden
Mehr1 Vom Problem zum Programm
Hintergrundinformationen zur Vorlesung GRUNDLAGEN DER INFORMATIK I Studiengang Elektrotechnik WS 02/03 AG Betriebssysteme FB3 Kirsten Berkenkötter 1 Vom Problem zum Programm Aufgabenstellung analysieren
MehrNina. bei der Hörgeräte-Akustikerin. Musterexemplar
Nina bei der Hörgeräte-Akustikerin Nina bei der Hörgeräte-Akustikerin Herausgeber: uphoff pr-consulting Alfred-Wegener-Str. 6 35039 Marburg Tel.: 0 64 21 / 4 07 95-0 info@uphoff-pr.de www.uphoff-pr.de
MehrWinWerk. Prozess 6a Rabatt gemäss Vorjahresverbrauch. KMU Ratgeber AG. Inhaltsverzeichnis. Im Ifang 16 8307 Effretikon
WinWerk Prozess 6a Rabatt gemäss Vorjahresverbrauch 8307 Effretikon Telefon: 052-740 11 11 Telefax: 052-740 11 71 E-Mail info@kmuratgeber.ch Internet: www.winwerk.ch Inhaltsverzeichnis 1 Ablauf der Rabattverarbeitung...
MehrWhitepaper. Produkt: combit Relationship Manager 7. combit Relationship Manager email-rückläufer Script. combit GmbH Untere Laube 30 78462 Konstanz
combit GmbH Untere Laube 30 78462 Konstanz Whitepaper Produkt: combit Relationship Manager 7 combit Relationship Manager email-rückläufer Script Inhalt Einleitung 3 Notwendige Anpassungen 3 crm Solution
MehrBeweisbar sichere Verschlüsselung
Beweisbar sichere Verschlüsselung ITS-Wahlpflichtvorlesung Dr. Bodo Möller Ruhr-Universität Bochum Horst-Görtz-Institut für IT-Sicherheit Lehrstuhl für Kommunikationssicherheit bmoeller@crypto.rub.de 6
MehrFolge 18 - Vererbung
Workshop Folge 18 - Vererbung 18.1 Ein einfacher Fall der Vererbung Schritt 1 - Vorbereitungen Besorgen Sie sich - vielleicht aus einer der Übungen der Folge 17 - ein fertiges und lauffähiges Listenprojekt,
MehrHilfedatei der Oden$-Börse Stand Juni 2014
Hilfedatei der Oden$-Börse Stand Juni 2014 Inhalt 1. Einleitung... 2 2. Die Anmeldung... 2 2.1 Die Erstregistrierung... 3 2.2 Die Mitgliedsnummer anfordern... 4 3. Die Funktionen für Nutzer... 5 3.1 Arbeiten
MehrÜbungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag
Ludwig-Maximilians-Universität München WS 2015/16 Institut für Informatik Übungsblatt 9 Prof. Dr. R. Hennicker, A. Klarl Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung:
MehrGezielt über Folien hinweg springen
Gezielt über Folien hinweg springen Nehmen wir an, Sie haben eine relativ große Präsentation. Manchmal möchten Sie über Folien hinweg zu anderen Folien springen. Das kann vorkommen, weil Sie den gesamten
MehrONLINE-AKADEMIE. "Diplomierter NLP Anwender für Schule und Unterricht" Ziele
ONLINE-AKADEMIE Ziele Wenn man von Menschen hört, die etwas Großartiges in ihrem Leben geleistet haben, erfahren wir oft, dass diese ihr Ziel über Jahre verfolgt haben oder diesen Wunsch schon bereits
MehrMoni KielNET-Mailbox
Bedienungsanleitung Moni -Mailbox Die geht für Sie ran! Wann Sie wollen, wo immer Sie sind! im Festnetz Herzlichen Glückwunsch zu Moni Ihrer persönlichen -Mailbox! Wir haben Ihre persönliche -Mailbox eingerichtet.
MehrAlle Schlüssel-Karten (blaue Rückseite) werden den Schlüssel-Farben nach sortiert und in vier getrennte Stapel mit der Bildseite nach oben gelegt.
Gentlemen", bitte zur Kasse! Ravensburger Spiele Nr. 01 264 0 Autoren: Wolfgang Kramer und Jürgen P. K. Grunau Grafik: Erhard Dietl Ein Gaunerspiel für 3-6 Gentlemen" ab 10 Jahren Inhalt: 35 Tresor-Karten
MehrÜbungen zu Softwaretechnik
Prof. Dr. Dr. h.c. M. Broy Lösungsblatt 11 Dr. H. Ehler, S. Wagner 23. Januar 2004 Übungen zu Softwaretechnik Aufgabe 16 Qualitätseigenschaften Broker-Pattern Beurteilen Sie das in Aufgabe 15 benutzte
MehrSoftware Engineering Klassendiagramme Assoziationen
Software Engineering Klassendiagramme Assoziationen Prof. Adrian A. Müller, PMP, PSM 1, CSM Fachbereich Informatik und Mikrosystemtechnik 1 Lesen von Multiplizitäten (1) Multiplizitäten werden folgendermaßen
MehrMCRServlet Table of contents
Table of contents 1 Das Zusammenspiel der Servlets mit dem MCRServlet... 2 1 Das Zusammenspiel der Servlets mit dem MCRServlet Als übergeordnetes Servlet mit einigen grundlegenden Funktionalitäten dient
Mehr1. Allgemein 2. 2. Speichern und Zwischenspeichern des Designs 2. 3. Auswahl der zu bearbeitenden Seite 2. 4. Text ergänzen 3. 5. Textgrösse ändern 3
Inhaltsverzeichnis 1. Allgemein 2 2. Speichern und Zwischenspeichern des Designs 2 3. Auswahl der zu bearbeitenden Seite 2 4. Text ergänzen 3 5. Textgrösse ändern 3 6. Schriftart ändern 3 7. Textfarbe
MehrEinleitung. Hauptteil. Wir befinden uns nun im Demoarchiv.
Dublettenprüfung Einleitung Herzlich willkommen zum ELOoffice 8 Video-Training Dublettenprüfung. Mein Name ist Andreas Schulz, ich bin bei ELO für das Produktmanagement verantwortlich und werde Sie in
MehrKulturelle Evolution 12
3.3 Kulturelle Evolution Kulturelle Evolution Kulturelle Evolution 12 Seit die Menschen Erfindungen machen wie z.b. das Rad oder den Pflug, haben sie sich im Körperbau kaum mehr verändert. Dafür war einfach
MehrObjektorientierte Programmierung. Kapitel 12: Interfaces
12. Interfaces 1/14 Objektorientierte Programmierung Kapitel 12: Interfaces Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester 2012/13 http://www.informatik.uni-halle.de/ brass/oop12/
MehrRobot Karol für Delphi
Robot Karol für Delphi Reinhard Nitzsche, OSZ Handel I Version 0.1 vom 24. Januar 2003 Zusammenfassung Nach der Einführung in die (variablenfreie) Programmierung mit Robot Karol von Freiberger und Krško
MehrSoftware Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015
Software Engineering Zur Architektur der Applikation Data Repository Franz-Josef Elmer, Universität Basel, HS 2015 Software Engineering: Mit acht bewährten Praktiken zu gutem Code 2 Schichtarchitektur
MehrInsiderwissen 2013. Hintergrund
Insiderwissen 213 XING EVENTS mit der Eventmanagement-Software für Online Eventregistrierung &Ticketing amiando, hat es sich erneut zur Aufgabe gemacht zu analysieren, wie Eventveranstalter ihre Veranstaltungen
MehrEin Blick voraus. des Autors von C++: Bjarne Stroustrup. 04.06.2005 Conrad Kobsch
Ein Blick voraus des Autors von C++: Bjarne Stroustrup 04.06.2005 Conrad Kobsch Inhalt Einleitung Rückblick Nur eine Übergangslösung? Was würde C++ effektiver machen? Quelle 2 Einleitung Wo steht C++,
MehrZahlen auf einen Blick
Zahlen auf einen Blick Nicht ohne Grund heißt es: Ein Bild sagt mehr als 1000 Worte. Die meisten Menschen nehmen Informationen schneller auf und behalten diese eher, wenn sie als Schaubild dargeboten werden.
MehrDatei Erweiterungen Anzeigen!
Einleitung Beim Kauf eines PCs werden die Dateierweiterungen sowie einige Dateien nicht angezeigt. Grund: Es gibt sehr viele Dateien die für das System ganz wichtig sind. Diese Dateien und auch Ordner
MehrWoche 1: Was ist NLP? Die Geschichte des NLP.
Woche 1: Was ist NLP? Die Geschichte des NLP. Liebe(r) Kursteilnehmer(in)! Im ersten Theorieteil der heutigen Woche beschäftigen wir uns mit der Entstehungsgeschichte des NLP. Zuerst aber eine Frage: Wissen
Mehr1. Adressen für den Serienversand (Briefe Katalogdruck Werbung/Anfrage ) auswählen. Die Auswahl kann gespeichert werden.
Der Serienversand Was kann man mit der Maske Serienversand machen? 1. Adressen für den Serienversand (Briefe Katalogdruck Werbung/Anfrage ) auswählen. Die Auswahl kann gespeichert werden. 2. Adressen auswählen,
MehrS/W mit PhotoLine. Inhaltsverzeichnis. PhotoLine
PhotoLine S/W mit PhotoLine Erstellt mit Version 16.11 Ich liebe Schwarzweiß-Bilder und schaue mir neidisch die Meisterwerke an, die andere Fotografen zustande bringen. Schon lange versuche ich, auch so
MehrLizenzierung von SharePoint Server 2013
Lizenzierung von SharePoint Server 2013 Das Lizenzmodell von SharePoint Server 2013 besteht aus zwei Komponenten: Serverlizenzen zur Lizenzierung der Serversoftware und CALs zur Lizenzierung der Zugriffe
MehrDie Textvorlagen in Microsoft WORD und LibreOffice Writer
Die Textvorlagen in Microsoft WORD und LibreOffice Writer Liebe Teilnehmer(-innen) am Landeswettbewerb Deutsche Sprache und Literatur Baden- Württemberg, Diese Anleitung soll Ihnen helfen Ihren Wettbewerbsbeitrag
MehrKonzentration auf das. Wesentliche.
Konzentration auf das Wesentliche. Machen Sie Ihre Kanzleiarbeit effizienter. 2 Sehr geehrte Leserin, sehr geehrter Leser, die Grundlagen Ihres Erfolges als Rechtsanwalt sind Ihre Expertise und Ihre Mandantenorientierung.
Mehr