1. Aufgabe - oth

Werbung
FACHBEREICH
INFORMATIK UND MATHEMATIK
WOLFGANG WIEDERMANN
JOHANNES MADER
Aufgaben zum Fach Verteilte Systeme
Blatt 1: Java 5, Reflection, Annotations Æ RMI, Web-Services, EJB
1. Aufgabe: Generische Elemente
1.1. Listen
Geben Sie ein Java-Programm an, welches eine Reihe von Zahlen in ein List<Integer>Element einliest.
1.2. Mengen
Geben Sie ein Java-Programm an, welches eine Reihe von Zahlen in ein Set<Integer>Element einliest.
2. Aufgabe: Reflection aus dem Package java.lang.reflect.*
Ein Java-Programm soll eine angegebene Java-Klasse laden. Sie können die Anweisung forName(className) der Klasse Class benutzen. Damit steht ein Objekt der Klasse java.lang.Class zur Verfügung, das wir in den Aufgaben mit Hilfe der Reflection untersuchen.
2.1. Aufgabe
Das Programm soll mit Hilfe des Java-Reflection-Mechanismus aus dem Package java.lang.reflect die Beschreibung aller Methoden in eine Liste List<Method> eintragen.
Dann sollen die Namen aller Methoden mit ihren Parametern ausgegeben werden. Hinweis:
getDeclaredMethods() der Klasse java.lang.Class
2.2. Aufgabe
Das Programm soll alle Felder in eine Liste List<Field> eintragen. Danach sollen die Namen aller Felder mit ihren Typen ausgegeben werden. Hinweis: Methode getDeclaredFields() der Klasse java.lang.Class.
3. Aufgabe: Annotations
Über Annotations kann man Anmerkungen in ein Programm einbringen, die bis in die JavaKlasse erhalten bleiben können. Dort kann man auch sie über die Reflection-Mechanismen
auslesen und auswerten. So kann der Entwickler Informationen über den Programmcode bis
hin zu irgendwelchen unterstützenden Systemen „durchreichen“. Beispiel: die PersistenzSchichten für Java-Systeme, wie etwa Hibernate. Solche Systeme analysieren die JavaKlassen und erzeugen automatisch den JDBC-Programmcode für das Speichern und Laden
der Objekte. Diese Aufgabe soll einen Einblick in die prinzipielle Arbeitsweise eines solchen
Systems bieten.
3.1. Aufgabe: Ausgabe der Annotations
Ein Programm soll wie bei der vorigen Aufgabe eine Klasse laden und diese nur dann bearbeiten, wenn sie mit der Annotation Entity versehen ist (isAnnotationPresent()-Methode
der Klasse java.lang.Class). Ferner sollen alle Attribute mit Namen und Typ ausgegeben
werden. Im Gegensatz zu Aufgabe 2.2 soll der mit der Annotation Column markierte Name
anstelle des Attributnamens verwendet werden, sofern vorhanden.
Beispiel
@Entity ("TABELLE_KUNDE")
public class Kunde {
private long kundennummer;
@Column (name="Spalte_Name")
private String name;
… getter/setter
}
Klasse durch Anmerkung markiert
Name durch Anmerkung markiert
Seite 2 von 2
FHR, FB IM, Johannes Mader
VS
Ausgabe
name kundennummer Typ long
name Spalte_Name Typ java.lang.String
3.2. Generieren von Code zum Abgleich mit Datenbanken
Aufbauend auf Aufgabe 3.1 kann man die Reflection dazu benützen, Programmcode für Datenbankzugriffe zu erzeugen. Mit den vorhandenen Informationen (Name der Tabelle, Name
und Typ der Attribute, ein bestimmtes Objekt) sollte das Vorhaben mit Hilfe einer JDBCVerbindung gelingen.
Klasse
Æ
Attribute
Æ
Falls Annotation vorhanden
Tabelle
Name aus Annotation Entity
Spalten der Tabelle
Name = Name des Attributs
Typ = Typ des Attributs
Verwende den Namen aus Annotation Column
Beispiel
Eine Verbindung zur Datenbank (Connection-Objekt) namens con soll vorhanden sein. Dann
lässt sich ein Kunde-Objekt aus der Datenbank mit den folgenden Befehlen wiederherstellen.
public Kunde ladeKunde (Connection con, long kundennummer) {
Statement stmt = con.createStatement();
String query = "select kundennummer, Spalte_Name from TABELLE_KUNDE
where kundennummer =" + kundennummer);
ResultSet rs = stmt.executeQuery (query);
Kunde kunde = new Kunde ();
try {
kunde.kundennummer = rs.getLong("kundennummer");
kunde.name = rs.getString("name");
} catch (Exception e) { … /* Hier zu aufwendig */}
return kunde;
}
Ihr Programm soll aus der in 3.1 gegebenen Klasse diesen (oder einen funktional gleichen)
Programmabschnitt erzeugen. Der Programmcode muss nicht compilierbar sein.
4. Dynamischer Aufruf von Methoden
Aktuelle Middleware-Technologien für verteilte Systeme arbeiten nicht mit der Generierung
von Codeteilen zum Aufruf von Methoden. Diese Technologie wird bei RMI1.1, MicrosoftDCOM oder CORBA eingesetzt. Sie ist zwar effizient, erfordert aber komplexe Programmiersysteme. Stattdessen setzen viele aktuelle Systeme (wie RMI 1.2 oder Web-Services) auf
dynamische Aufrufe. Hier „kennt“ der Aufrufer die gerufene Methode nicht.
Die Klasse Method enthält die „Wundermethode“ invoke. Für eine bestimmte Methode, die
über Reflection ausgelesen werden kann, erwartet sie als Parameter ein Objekt sowie eine
Folge von Parametern für die Methode. Diese Folge von Parametern kann nach Lage der Dinge nur als Folge von Objekten übergeben werden.
Gegeben ist ein Objekt der Klasse Kunde, ein Kunde k. Geben Sie eine Methode „dynCall“
an, die die Methode setKundennummer für das Objekt k mit einem Wert Ihrer Wahl aufruft.
Überzeugen Sie sich nach dem Aufruf, dass das Objekt wirklich die angegebene Kundennummer enthält. Diese Überprüfung können Sie z.B. konventionell mit dem Aufruf
k.getKundennummer() durchführen.
Herunterladen