Wie ich schon vorher erwähnt habe, es ist möglich Java Klassen in Jython zu benutzen, was die Sprache mächtig erweitert. Alles was Sie in Java machen können, können Sie auch in Jython machen, in dem Sie Python Syntax benutzen. Die Entwicklungszeit kann durch die Verwendung von Java Klassen erheblich reduziert werden.
Lassen Sie uns ein bisschen mit Java rumspielen. Indem wir die Swing Klassen von Java benutzen, können wir schnell ein Fenster mit einer Nachricht an den Benutzer erstellen. Ein Beispiel dafür in Java wäre:
import javax.swing.JOptionPane;
class testDialog {
public static void main ( String[] args ) {
javax.swing.JOptionPane.showMessageDialog ( null, "The test." );
}
}
Mit Jython können wir Anzahl der Code-Zeilen etwas reduzieren. Schreiben Sie folgenden Skript und übergeben Sie ihn an Jython Interpreter:
import javax.swing.JOptionPane
javax.swing.JOptionPane.showMessageDialog ( None, "The Test." )
Wie Sie sehen wurde hier mit Hilfe von Python Syntax auf einen Java Package zugegriffen. Dabei mussten wir aber nichts kompilieren. Es beschleunigt das Entwicklungsprozes ein wenig, da wir nicht jedes Mal auf die Java Kompilierung warten müssen, wenn nur einen kleinen Fehler in der Applikation korrigiert werden muss.
Wenn Sie immer noch keine Vorteile in Nutzung von Jython sehen, lassen Sie uns etwas größere Anwendung aus Java in Jython konvertieren. Zuerst erstellen wie ein Spielwürfel-Anwendung ind Java. Der Anwender muss in der Lager sein, Anzahl der Würfelseiten und Anzahl der Würfelumdrehung, benor der Würfel zum Stehen kommt, zu bestimmen. Das Programm wird dann Zufallswerte innerhlab eines gültigen Bereichs generieren und die Ergebnisse dem Anwender präsentieren. Zuerst Java Code:
import java.util.Random;
import javax.swing.JOptionPane;
class DieRoller {
public static void main ( String[] args ) {
System.out.println ( "Die Roller" );
System.out.println ( "- - - - -" );
query();
}
public static void query () {
String sidesS = JOptionPane.showInputDialog ( null, "How many sides should the die have?" );
String rollsS = JOptionPane.showInputDialog ( null, "How many times should we roll the die?" );
try {
int sides = Integer.parseInt ( sidesS );
int rolls = Integer.parseInt ( rollsS );
roll( sides, rolls );
} catch ( Exception e ) {
JOptionPane.showMessageDialog ( null, "Error!" );
}
}
public static void roll( int sides, int rolls ) {
int current = 1;
Random rand = new java.util.Random();
while ( current <= rolls ) {
System.out.println ( "Roll " + current + ": " + rand.nextInt ( sides ) );
current++;
}
}
}
}
Mit Jython können Sie Anzahl der Codezeilen reduzieren und dabei dasselbe Ergebnis zu erzielen:
import java.util.Random;
import javax.swing.JOptionPane;
print 'Die Roller'
print '- - - - -'
try:
sides = int ( javax.swing.JOptionPane.showInputDialog ( None, 'How many sides should the die have?' ) )
rolls = int ( javax.swing.JOptionPane.showInputDialog ( None, 'How many times should we roll the die?' ) )
rand = java.util.Random()
for current in range ( rolls ):
print 'Roll ' + str ( current + 1 ) + ': ' + str ( rand.nextInt ( sides ) )
except:
javax.swing.JOptionPane.showMessageDialog ( None, 'Error!' )
Merken Sie sich, wie die while-Schleife in Java durch die for-Schleife in Python ersetzt wird. In diesem Fall ist die Schleife sogar vereinfacht worden. Überhaupt stellt die Möglichkeit der Nutzung von for-Schleifen in Python den Hauptvorteil von Jython dar.
Natürlich können Sie mit Jython nicht nur Java-Applikationen programmieren, sondern auch Servlets, Beans und Applets. Lassen Sie uns ein einfaches Java Applet für das nächste Beispiel erstellen.
import java.applet.Applet;
class TestApplet {
public void paint ( Graphics g ) {
g.drawSring ( "A script a day keeps the doctor away.", 5, 5 );
}
}
Das Übersetzen von diesem Code in Jython ist sehr einfach. Es wird wieder wir das gleiche Ergebnis erwartet:
import java.applet.Applet;
class TestApplet ( java.applet.Applet ):
def paint ( self, g ):
g.drawString ( "A script a day keeps the doctor away.", 5, 5 )
Das Applet muss vor der Verwendung zuerst kompiliert werden. Das wird mit dem in Jython zur Verfügung stehenden Kompilier gemacht:
jythonc –-deep –-core –-compiler <compiler path> TestApplet.py
Übrigens nicht nur Applets sondern auch ganze Applikationen können so kompiliert werden.
Nun kommt es auch vor, dass Sie ihre Jython-Klasse aus einer bereits existierenden Java-Klasse ableiten wollen. Auch diese Möglichkeit wird von Jython geboten. Das Erstellen der abegeleiteten Java-Klassen wird genau so gemacht, wie das Erstellen der Subklassen in Python. Lassen Sie uns die Klassenmethode nextInt() aus der Klasse java.util.Random modifizieren, so dass sie einen String anstatt von Integer zurückliefert. Um die Zufallswerte zu generieren, rufen wir die Methode der Superklasse.
>>> import java.util.Random
>>> class StringRandom ( java.util.Random ):
... def nextInt ( self ):
... return str ( java.util.Random.nextInt ( self ) )
...
>>> x = StringRandom()
>>> x.nextInt()
'834361961'
>>> x.nextInt()
'159629831'
>>> x.nextInt()
'-1197591800'
Allein das Hinzufügen der zusätzlichen Klasseneigenschaften zu einem Java Objekt ist in Jython nicht möglich und daher müssen Sie abgeleitete Subklasse in Jython erstellen, wenn Sie zusätzlichen Eigenschaften benötigen:
>>> import java.util.Random
>>> rand = java.util.Random()
>>> rand.doesNotExist = 5
Traceback (innermost last):
File "", line 1, in ?
TypeError: can't set arbitrary attribute in java instance: doesNotExist
>>> class DumbyRandom ( java.utilRandom ):
... pass
...
>>> rand = DumbyRandom()
>>> rand.doesNotExist = 5
>>> print rand.doesNotExist
5
>>> print rand.nextInt()
-1884599813
Wie Sie sehen, funktioniert die Jython-Klasse DumbyRandom genau so wie die Java-Klasse Random. Die Jython-Klasse wurde lediglich um eine zusätzliche Eigenschaft erweitert.