Upload
clotilda-heisinger
View
107
Download
0
Tags:
Embed Size (px)
Citation preview
SWT 17.6.99JAVABEANS und Komposition
Oliver Stiemerling
Universität Bonn
• JAVABEANS
– Events– Properties– Reflection
• Komposition– Alternative Ansätze– Vergleich
Überblick JAVABEANS
• Komponentenmodell:– Was ist eine Komponente?– Wie interagieren Komponenten?– Wie werden Komponenten "verdrahtet"?
• JAVABEANS:– Komponente = Menge von Java Klassen
(hauptsächlich GUI, aber auch unsichtbare Komponenten) – Interaktion über Events– Verdrahtung durch Entwicklungswerkzeug
Event Interaktion: Grundlagen• Event "Quelle" (source) ruft eine Eventhandling
Methode beim Event "Zuhörer" (listener) auf:
• Es wird keine Resultat zurückgegeben...
Instanz Komponente A
InstanzKomponente B
SWTListenerInterface
handleSWTEvent(e);
e
handleSWTEvent(e);addSWTListener(l);removeSWTListener(l);
actionPerformed(e);
Event Interaktion: Verbindungen• Multicast:
– >1 Eventlistener
– keine garantierte Reihenfolge!
• Fan-in:– Ein Listener hört auf >1 Quellen
– Synchronisierung?– synchronized
Instanz Komponente A
e
addSWTListener(l);removeSWTListener(l);
InstanzKomponente B
SWTListenerInterface handleSWTEvent(e);
Event Interaktion: Elemente
• Event Klasse: SWTEvent• Eventlistener Interface: SWTListener• Eventsource Klasse: A• Eventlistener Klasse: B
Instanz Komponente A
InstanzKomponente B
SWTListenerInterface
handleSWTEvent(e);
e
handleSWTEvent(e);addSWTListener(l);removeSWTListener(l);
Event Klasse: SWTEvent
public class SWTEvent extends java.util.EventObject {
private int info; // zusätzliche Informationen zum Ereignis
public SWTEvent (Object source, int info) { super (source); this.info = info; }
public int getInfo () {return info;}}
Eventlistener Interface: SWTListener
public interface SWTListener extends java.util.EventListener {
public void handleEvent (SWTEvent e);
}
Eventsource Klasse: Apublic class A {
Vector listeners = new Vector ();
public void synchronized addSWTListener (SWTListener listener) { listeners.addElement (listener); } public void synchronized removeSWTListener (SWTListener listener) { listeners.removeElement (listener); }
private void fireSWTEvent () { SWTEvent e = new SWTEvent (this, 9999); int n = listeners.size (); for (int i = 0; i < n; i++) { (SWTListener) listeners.elementAt (i).handleEvent(e); } }}
Daran erkenntman eine EventQuelle!
Eventlistener Klasse: B
public class B implements SWTListener {...
public void handleEvent(SWTEvent e) {doSomething();
...}
}
Daran erkenntman einen EventListener!
Zusammenfassung Events• Events werden durch void method calls realisiert• multicast und fan-in sind möglich• 4 Implementierungselemente:
– Event Klasse– EventListener Inferface– Eventsource Klasse (Methodensignaturen)– Eventlistener Klasse (implementiert Interface)
• "Umverdrahten" zur Laufzeit möglich
Events ++: Adapter• Event soll einen bestimmten, nicht
antizipierten Methodenaufruf im Listener verursachen
=> Mehr Flexibilität
Instanz Komponente A
InstanzKomponente B
SWTListenerInterface
e
handleSWTEvent(e);addSWTListener(l);removeSWTListener(l);
Adapter
machWasBesonderes();
machWasBesonderes();
JAVABEANS: Properties• Properties = (veränderbare) Eigenschaften
einer Komponente
• Methodensignatur:void setHintergrundfarbe (Farbe wert);
Farbe getHintergrundfarbe();
• Drei Arten von Properties:– "silent"– bound: Änderungen erzeugen Events– constraint: Änderungen erzeugen Events und
können verhindert werden
JAVABEANS: Reflection
• Dynamisches Nachladen einer Klasse:Klasse = ClassLoader.loadClass("Unbekannt", true);
• Analyse der Methoden der KlasseMethoden[ ] = Klasse.getMethods();
...
if (Methoden[i].getName.startsWith("add")) { };
• Dynamisches Aufrufen von MethodenMethoden[i].invoke(Instanz_von_Klasse,Parameter[ ]);
JAVABEANS: Benutzungsmodell
• Entwickler erhält Bean mit allen Klassen &
Ressourcen (z.B. bitmaps) als JAR Datei
• Entwicklungswerkzeug analysiert Bean => Event
(Ein- und Ausgänge), Methoden, Properties
• Komposition: Bean wird instanziiert, Properties
werden gesetzt, Instanz wird mit anderen Bean
Instanzen "verdrahtet"
• "Netz" von Beans wird persistent gemacht
Design Modus -------> Runtime Modus
Komposition• "Beschreibung eines Systems von
Softwarekomponenten"
• Unterschiedliche Ansätze
• Gemeinsame Elemente:– Komponenteninstanzen– Komponenteneigenschaften– Komponentenverbindungen
AB
DC
A B
DC
AKomponenten laufendes System
Kompositionswerkzeuge
• IBM Visual Age JAVABEANS
• MS Visual Basic COM
• Unix Shell Skripte Pipes & Filters
• Regis (DARWIN) "Applikationen"
Komponentenmodell
=> Vielzahl von unterschiedlichen Komponentenmodellen=> Vielzahl von Kompositionsmethoden
IBM Visual Age for Java
• Visuelle Komposition
• Erzeugt reinen Java Code
• Komposition wird compiliert
• => System = "normales" Java Programm
IBM Visual Age: erzeugter Code
public SWTFrame() {initialize();
} private void initialize() {getButton1().addActionListener(this);
}
private java.awt.Button getButton1() {if (ivjButton1 == null) {
ivjButton1 = new java.awt.Button();ivjButton1.setName("Button1");ivjButton1.setBounds(53, 29, 134, 37);ivjButton1.setLabel("Und tschüß");
};return ivjButton1;
public class SWTFrame extends java.awt.Frame private java.awt.Button ivjButton1 = null;
MS Visual Basic
• Visuelle Komposition + Scripting• Skript wird in speziellen P-Code übersetzt• Komponenten selber in C++ (compiliert)
=> System = P-Code + Komponenten + VB Runtime
Unix Shell Skript#!/bin/sh# Test auf unbekannte Schluesselwoerter
awk '! /^#/' keywords |tr -c '[A-Z][a-z]' '[\012*]' | sort -u > /tmp/words
grep -h '^#Keys' $* | tr -c '[A-Z][a-z]' '[\012*]' |grep -v 'Keys' |sort -u |comm -23 - /tmp/words > /tmp/unknown
echo "Unknown keywords:"cat /tmp/unknown
Komponenteninstanzen
Komponenteneigenschaften
Komponentenverbindungen
=> System = Skript-file + Executables
© Nierstrasz & Schneider
DARWIN: Eine Kompositionssprache für verteilte Systeme
• Komponenten: lokale Applikationen / Prozesse
• Verbindungen: Methodenaufrufe ("Services")
component System {required input daten;provided output daten;
subcomponent Instanz1 ExeA@machine1(Parameter1 = 5);subcomponent Instanz2 ExeA@machine2;
bind Instanz1.Port1 -- Input bind Instanz1.Port2 -- Instanz2.Port1;
bind Instanz2.Port2 -- Output;}
System
Instanz1
Port1Port2 Port2Port1
Input OutputInstanz2
=> System = Darwin file + Executables + Runtime Umgebung
Regis Runtime Umgebung
DARWIN Ablauf
component System {required input daten;provided output daten;
subcomponent Instanz1 ExeA@machine1(Parameter1 = 5);subcomponent Instanz2 ExeA@machine2;
bind Instanz1.Port1 -- Input
bind Instanz1.Port2 -- Instanz2.Port1;
bind Instanz2.Port2 -- Output;
}
machine1 machine1
System
Instanz1 von Executable
Port1Port2 Port2Port1
Input OutputInstanz2 von Executable
Executable.exe... Andere.exe
Zusammenfassung• IBM Visual Age
System = Java Programm (+ Virtual Machine)
• MS Visual BasicSystem = P-Code + Komponenten + VB Runtime
• Unix Shell SkripteSystem = Skript + Executables (+ Shell)
• Regis (DARWIN)System = DARWIN file + Executables + Regis Runtime
Zusammenfassung 2: Unterschiede
• Wie wird komponiert? (Interface: textuell, visuell, gemischt)
• Anzahl der Sprachen zur Beschreibung des ausgelieferten Systems? (nur Java, Kompositionssprache + Programmiersprache, Programmiersprache1 + Programmiersprache2)
• Ist das resultierende System verteilt oder lokal?• Wann werden Änderungen in der Komposition
wirksam? (nach dem Neustart, nach Compilieren+Neustart, sofort)
Dynamische Anpaßbarkeit der Komposition einer Anwendung
• Integration von Kompositionsumgebung + Laufzeitumgebung
EVOLVE