ReflectShell

Dieses Modul ist für den Java-Entwickler bestimmt. Es basiert auf dem Prinzip der Reflexion (Wikipedia).
ReflectShell ermöglicht es, zur Laufzeit Klassen zu laden, Objekte davon zu instantiieren und diese durch Methodenaufrufe zu manipulieren. Die ReflectShell hat einen einfachen Objekt-Pool, in dem die Objekte durch einen Namen zugreifbar sind. Die Aufruf-Argumente werden durch einen flexiblen "Caster" erzeugt, der sowohl Namen aus dem Objekt-Pool parsert, als auch Literale von Strings, Java-Klassen und primitiven Typen zu "erschaffen". Dabei benutzt er die Signaturen der möglichen Methoden, um den sinnvollsten Typ für die Argumente zu erzeugen.
Die grafische Java-Konsole Shell ist eine ideale Ergänzung dazu, kann aber auch einzeln benutzt werden.

die Anwendung

Die Einbindung in ein eigenes Projekt geschieht durch nur wenige Codezeilen, zb:

import org.dronus.reflector.ReflectShell;
...
ReflectShell rs=ReflectShell.stdReflectShell(); //die Reflect-Shell erzeugen

Die Reflect-Shell meldet sich dann automatisch bei System.in bzw out an.
Dann sollte der Entwickler dem Benutzer noch einige Objekte zum Spielen geben, z.B im Konstruktor des eigenen Malprogrammes:

rs.add("painter", this);
rs.add("leinwand", this.getPaintCanvas());

Darauf findet man zur Laufzeit nach eingeben des "list"-Befehls in der Reflect-Shell die Objekte "painter" und "leinwand" vor, und der Spaß kann losgehen:

ReflectCommand>farbe=new java.awt.Color 10 30 40
Try to create class java.awt.Color

ReflectCommand>farbe
java.awt.Color[r=10,g=30,b=40]

ReflectCommand> leinwand.floodFill 10 30 farbe
<null>
ReflectCommand> painter.saveImg "c:\temp\tollesBild.jpg"
true

usw.

Das Ganze eignet sich um komplizierte Klassen vor der Einbundung im Projekt zu testen, Laufzeit-Debugging durchzuführen und als primitive, aber automatisch generierte Scriptsprache für eigene Programme. Hier kommt der Vorteil zu Geltung dass ausser der Anmeldung der Objekte keine Einrichtung erforderlich ist, alle öffentlichen Methoden stehen automatisch als Script-Kommandos zur Verfügung.

ReflectShell als Programmierer-Benimmlehrer

Und damit sind wir beim allergrößten Vorteil: Erziehung. Der Entwickler, der RefelectShell verwendet, bekommt sofort mit, ob seine Schnittstellen sinnvoll oder unpraktisch sind. Die ReflectShell erzeugt kostenlos einen Maßstab für die Programmqualität... Das ist natürlich nur eine von vielen möglichen Ansichten, aber immerhin eine. Ein modulares Programm "besten Stils" im Sinne von RefelctShell ist also jenes, das sich nicht nur mit seiner sichtbaren Oberfläche dem Benutzer zusagt, sondern auch unter der Haube "benutzerfreundlich", also mit der Shell konfortabel handhabbar ist. Das entspricht im besten Sinne der Forderung der OOP-Idee: Transparente, klare Objektstrukturen, die ihre Schnittstellen zu ihrer Manipulation und Interaktion höflich anbieten.

Shell

Als Beilage empfehlen wir die Shell, eine grafische AWT-basierte Shell, die man einfach die Java-IO-konsole übenehmen lässt. Die Shell unterstützt History und darauf basierend Eingabe-Vervollständigung, sowie einen Log-File und ist für alle Java-Programme mit Nutzer-Interaktion über die Konsole praktisch. Sie kann durch nur einen statischen Methoden-Aufruf an System.in / out angeschlossen werden, und übernimmt dann die Konsolen-Funktion:
Shell.stdIOShell("MeineAnwendung Konsole (Fenstertitel)");

Es empfiehlt sich diese Shell für eine angenehme Benutzung der Reflect-Shell:
import org.dronus.reflector.ReflectShell;
import org.dronus.shell.Shell;
...
Shell.stdIOShell("MeineAnwendung Konsole"); //Die "schöne" Shell erzeugen
ReflectShell rs=ReflectShell.stdReflectShell(); //die Reflect-Shell erzeugen


ReflectShell kann auch alleinstehend ausprobiert werden, die Java-API bietet ja bereits eine breite Spielwiese zum Austoben. Die Startklasse ist dann org.dronus.reflector.ReflectShell


ACHTUNG: ReflectShell bzw. verwendende Programme müssen unter Windows mit java.exe, nicht mit javaw.exe gestartet werden, da sonst kein Konsolen-Fenster zur Verfügung steht!!

ReflectShell downloaden (31kb ZIP)

Rudimentäre Dokumentation (englisch)



Wikipedia: Java
Wikipedia: Signatur
Wikipedia: Shell / Konsole
Wikipedia: OOP
Wikipedia: Schnittstellen
Wikipedia: AWT