1 Java 1.1 e B Java RMI orientierte Sprache e beschrieben in Klassendefinitionen und andere Datentypen: int, float, boolean, etc. referenzen Verweise auf e keine Zeiger, Adressen o.ä. B.1 B.2 1.1 e (2) 1.2 Methoden Klassenbeschreibung Methode ist eine Art Funktion Beispiel class Car Wheel [4] mywheels; Motor mymotor; int maxspeed = 180; Erzeugung neuer e Beispiel Car c = new Car(); // Definition der n kann auf eigenen zustand zugreifen wird an einem aufgerufen Beispiel class Car void startengine() mymotor.ignite(); B.3 B.4
1.2 Methoden (2) 1.3 Interfaces Methodenaufruf Schnittstelle eines s bei vorhandener referenz Übergabe von Parametern Rückgabe eines Ergebnisses Statische Methoden (static) sind an Klasse gebunden nicht an e über Klassennamen eigenständiges syntaktisches Konstrukt Klassen können Interfaces implementieren e von Klassen, die dasselbe Interface implementieren sind kompatibel Typpolymorphismus Interfaces enthalten nur Methoden oder Konstanten keine Attribute/ n Beispiel interface Vehicle boolean ismoving(); B.5 class Car implements Vehicle boolean ismoving() B.6 1.4 Vererbung 1.5 Exceptions Java als objektorientierte Sprache einfache Vererbung (extends) maximal eine Basisklasse übernimmt Beschreibung der Basisklasse Kompatibilität Beispiel class Van extends Car mehrfache Interface-Vererbung (implements) lediglich Schnittstelle jedoch keine Implementierung wird geerbt Beispiel interface Vehicle implements OwnedObject, ColouredObject B.7 Exception-Handling außerordentliche Beendigung eines Methodenaufrufs Beispiel: class Car void startengine() throws EngineFailure if throw new EngineFailure(); Exception kann beim eingefangen und ausgewertet werden Beispiel try c.startengine(); catch ( EngineFailure e ) B.8
1.6 Weitere Elemente 1.7 Sicherheitsmechanismen Hierarchische Benennung von Interfaces und Klassen Byte-Code-Verifier Paketname + Klassenname (Package) z.b. java.lang.object weltweite eindeutige Benennung durch Anlehnung des Paketnamens an Domainname z.b. org.aspectix.orb.orb (angelehnt an aspectix.org) Compilierung auf Klassenebene (Class File) übersetzt in interpretierten Byte-Code Dynamisches Laden von Klassen ClassLoader kann Klassen von beliebigen Quellen laden Ausführung des Byte-Codes erhält Semantik der Sprache z.b. kein Zugriff auf nicht-öffentliche n anderer e möglich Sandboxing Klassen eines neuen ClassLoaders werden von einem SecurityManager kontrolliert versagt oder gewährt Zugriff auf Dateien Zugriff auf Netzwerkverbindungen etc. Threads als Sprachkonzept verfügbar als spezielle e B.9 B.10 1.8 JVM 1.8 Parameterübergabe Java Virtual Machine orientierte Sprache Interpreter für Java Class-Files heute in der Regel JIT-Compiler Ausführungsumgebung für Java Programme bzw. Klassen mehrere ClassLoader möglich Semantik der Parameterübergabe Call-By-Object-Reference für e übergebene Referenz Call-By-Value für andere Datentypen (z.b. Integer-Typ int) 42 42 übergebener Wert B.11 B.12
2 Verteiltes Java 2 Verteiltes Java (2) Idee: Realisierung verteiltes Java Programm läuft auf mehreren JVMs (Knoten), möglicherweise auf mehreren Rechnern erfordert Unterstützungssoftware, z.b. durch eine Middleware Middleware liegt zwischen Anwendung und Betriebssysem e liegen in einer der verfügbaren JVMs transparenter Client weiß nicht, dass bearbeitung in anderen JVM erfolgt (verteilungstransparent) Client weiß nicht, in welcher JVM bearbeitung erfolgt (ortstransparent) Java Remote Method Invocation (RMI) Erweiterung des Java Programmiermodells für Verteilung mehrere JVMs spannen eine verteilte Rechenplattform auf Verteilungseinheiten Java e Beispiel: Knotengrenze B.13 B.14 2.1 Verteilte Java e 2.1 Verteilte Java e (2) Schnittstelle verteilte Java e / RMI-e implementieren spezielle Java-Interfaces genauer: mindestens ein Java-Interface, das direkt oder indirekt von java.rmi.remote erbt dient als Marker, enthält keine Methoden alle Methoden in von java.rmi.remote erbenden Interfaces müssen die Exception java.rmi.remoteexception deklarieren Beispiel package avo; public interface Printer extends java.rmi.remote public void print( String s ) throws java.rmi.remoteexception; zeigt Fehler bei entfernten en an es kann auch eine Basisklasse deklariert werden, z.b. java.io.ioexception oder java.lang.exception B.15 B.16
2.1 Verteilte Java e (2) 2.2 Erzeugen eines RMI-s Entfernt ansprechbare Methoden Übliches Vorgehen entfernt sind nur die Methoden aus Interfaces ansprechbar, die von Remote erben andere Methoden und n sind nur lokal ansprechbar Implementierungsklasse erbt/implementiert mind. ein Remote-Interface Implementierungsklasse erbt von java.rmi.server.unicastremoteobject bereitet instanz für entfernte e: exportiert Referenzen Referenzen nur mit dem Namen eines Remote-Interfaces typisieren nicht mit dem Klassennamen der Implementierung Beispiel: avo.printer p; try p.print( Testdruck ); catch( java.rmi.remoteexception e) Alternative Implementierungsklasse erbt/implementiert mind. ein Remote-Interface manuelles Vorbereiten für entfernte e: von java.rmi.server.unicastremoteobject.exportobject( obj, ) B.17 B.18 2.2 Erzeugen eines RMI-s (2) 2.2 Erzeugen eines RMI-s (3) Beispiel package avo; Realisierung eines entfernten s Einsatz von Stellvertreterobjekten public class MyPrinter extends java.rmi.server.unicastremoteobject implements Printer public void print( String s ) throws java.rmi.remoteexeception Client Stubobjekt Skeleton RMI- RMI-Compiler erzeugt Stubklasse (Stellvertreter) für Clientseite nur bis Java 1.4 notwendig ab Java 1.5 (Java 5) generische Stubs möglich erzeugt Skeletonklasse für Serverseite nur bis Java 1.1 notwendig ab Java 1.2 generische Skeletons B.19 B.20
2.2 Erzeugen eines RMI-s (4) 2.2 Erzeugen eines RMI-s (5) RMI-Compiler Kommando rmic z.b. für avo.myprinter wird Stubklasse avo.myprinter_stub erzeugt Stubklasse implementiert alle Remote-Interfaces der ursprünglichen klasse Compiler erkennt Remote-Interfaces an Marker-Interface java.rmi.remote Stubobjekt verhält sich wie RMI- Generische Stubobjekte Beispiel für das Erzeugen des s im Java-Code avo.printer p = new avo.myprinter();// Erzeugung des s wurde durch Basisklasse automatisch exportiert sofort von außen (entfernt) ansprechbar lokaler wie bisher entfernter (?) Referenz auf RMI- notwendig ab Java 1.5 (Java 5) und bei erben der UnicastRemoteObject-Klasse automatische Installierung kein rmic- nötig B.21 B.22 2.3 Finden initialer Referenzen 2.3 Finden initialer Referenzen (2) Namensdienst zum Registrieren von en Naming-Interface Klasse java.rmi.registry.locateregistry abkürzender Zugriff auf bestehende Registry erlaubt das Erzeugen einer Namensdienst-Instanz erlaubt das Erzeugen einer referenz zu einer (entfernten) Namensdienst-Instanz statische Methoden der Klasse java.rmi.naming bind( String s, Remote obj ) registriert obj unter Name s Hostname und Portnummer für TCP/IP-Verbindungen zum Namensdienst müssen bekannt sein lookup( String s ) gibt referenz für mit Namen s zurück referenz ist vom Remote-Interface java.rmi.registry.registry bind( String s, Remote obj ) registriert obj unter Name s lookup( String s ) gibt referenz für mit Namen s zurück String s ist von der Form: rmi://host:port/objectname host = Rechner, auf dem Registry läuft port = Portnummer, unter der Registry registriert ist objectname = name beim Registrieren bzw. Nachfragen B.23 B.24
2.3 Finden initialer Referenzen (3) 2.3 Finden initialer Referenzen (4) Beispiel Beispiel auf Serverseite auf Clientseite package avo; package avo; public class MyPrinter extends java.rmi.serverunicastremoteobject implements Printer static void main( String [] args ) Printer p = new MyPrinter(); java.rmi.naming.bind( "rmi:myprinter", p ); public void print( String s ) throws java.rmi.remoteexeception B.25 public class MyClient static void main( String [] args ) Printer p; p= (Printer) java.rmi.naming.lookup( "rmi:myprinter" ); try p.print( Testdruck ); catch( java.rmi.remoteexception e) B.26 2.4 Parameterübergabe 2.4 Parameterübergabe (2) Parameterübergabesemantik bei lokalen en Parameterübergabesemantik bei entfernten en Call-By-Value für Nicht-typen (z.b. Integer) Call-By-Object-Reference für Standard-Java-e und lokale RMI-e entfernte RMI-e Referenz auf Stubobjekt wird übergeben Client verwendet Stubobjekt wie lokales Call-By-Object-Reference Semantik für RMI-e übergebene Referenz Marshalling der Parameter Parameter werden serialisiert (Java Serialization) Erzeugung eines Bytestroms aus den Parametern Übertragung des Bytestroms Regenerierung der Datentypen und Java-e aus Bytestrom Call-By-Value für Nicht-typen (z.b. Integer) Datentypen werden kopiert Beispiel: 42 42 übergebener Wert B.27 Knotengrenze B.28
2.4 Parameterübergabe (3) 2.4 Parameterübergabe (3) serialisierbare Java-e und lokale, nicht-exportierte RMI-e Serialisierung führt zu vollständiger Kopie eines s und seiner untergeordneten e evtl. große transitive Hülle zu übertragender Daten aber: Erhaltung der struktur über alle Parameter Call-By-Copy Semantik übergebene struktur Parameterübergabesemantik bei entfernten en (fortges.) nicht-serialisierbare Java-e nicht übertragbar: MarshalException lokale, exportierte RMI-e Einfügung eines geeigneten Stubobjekts in den Bytestrom Regenerierung des Stubobjekts auf der Empfängerseite Call-By-Object-Reference Semantik für lokale RMI-e entfernte, exportierte RMI-e Einfügung des vorhandenen Stubobjekts in den Bytestrom Call-By-Object-Reference Semantik für entfernte RMI-e Knotengrenze B.29 übergebene Referenz B.30 2.5 Beispiel 2.5 Beispiel (2) Aufbau der Referenz über Namensdienst Aufbau der Stubs und Skeletons MyClient MyPrinter MyClient MyPrinter JVM Client 1:Ref 3:Ref 2:bind() 4:lookup() JVM Server JVM Client JVM Server JVM Registry Registry JVM Registry Registry B.31 B.32