Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Neues in Java 7
2 Threads und nebenläufige Programmierung
3 Datenstrukturen und Algorithmen
4 Raum und Zeit
5 Dateien, Verzeichnisse und Dateizugriffe
6 Datenströme
7 Die eXtensible Markup Language (XML)
8 Dateiformate
9 Grafische Oberflächen mit Swing
10 Grafikprogrammierung
11 Netzwerkprogrammierung
12 Verteilte Programmierung mit RMI
13 RESTful und SOAP Web-Services
14 JavaServer Pages und Servlets
15 Applets
16 Datenbankmanagement mit JDBC
17 Technologien für die Infrastruktur
18 Reflection und Annotationen
19 Dynamische Übersetzung und Skriptsprachen
20 Logging und Monitoring
21 Java Native Interface (JNI)
22 Sicherheitskonzepte
23 Dienstprogramme für die Java-Umgebung
Stichwort

Buch bestellen
Ihre Meinung?

Spacer
Java 7 - Mehr als eine Insel von Christian Ullenboom
Das Handbuch zu den Java SE-Bibliotheken
Buch: Java 7 - Mehr als eine Insel

Java 7 - Mehr als eine Insel
Rheinwerk Computing
1433 S., 2012, geb.
49,90 Euro, ISBN 978-3-8362-1507-7
Pfeil 19 Dynamische Übersetzung und Skriptsprachen
Pfeil 19.1 Codegenerierung
Pfeil 19.1.1 Generierung von Java-Quellcode
Pfeil 19.1.2 Codetransformationen
Pfeil 19.1.3 Erstellen von Java-Bytecode
Pfeil 19.2 Programme mit der Compiler API übersetzen
Pfeil 19.2.1 Java Compiler API
Pfeil 19.2.2 Fehler-Diagnose
Pfeil 19.2.3 Eine im String angegebene Compiliationseinheit übersetzen
Pfeil 19.2.4 Wenn Quelle und Ziel der Speicher sind
Pfeil 19.3 Ausführen von Skripten
Pfeil 19.3.1 JavaScript-Programme ausführen
Pfeil 19.3.2 Groovy
Pfeil 19.4 Zum Weiterlesen

Rheinwerk Computing - Zum Seitenanfang

19.3 Ausführen von SkriptenZur nächsten Überschrift

Seit Java 6 bietet die Standardbibliothek über das Paket javax.script eine API, um Skriptsprachen wie JavaScript, Groovy oder Jython anzusprechen. Diese API wurde im JSR-223, »Scripting for the Java Platform«, definiert, und das Standard-JDK und JRE bringt mit Rhino (http://www.mozilla.org/rhino/ScriptingJava.html) einen Interpreter für JavaScript mit. (Bei anderen Java SE-Implementierungen muss das nicht zwingend gegeben sein.)

Das in Java 6 neu ins bin-Verzeichnis aufgenommene Kommandozeilenprogramm jrunscript ermöglicht das Setzen von Variablen, das Ausführen von Skript-Code und das Auswerten von Ergebnissen. Eine Skript-Sprache kann auf den vollen Umfang der Java-API zurückgreifen, definiert aber üblicherweise auch eigene Bibliotheken.

Beispiel

Führe ein simples Skript über das Kommandozeilenprogramm aus:

$ jrunscript -e "print('Hallo JavaScript')"

Eine Skript-Engine führt die Skripte aus, indem sie das Parsen, Interpretieren und Verwalten der Objekte übernimmt. Rhino übernimmt JavaScript, doch die Webseite https://scripting.dev.java.net/ führt mehr als 10 weitere Skriptsprachen auf, die sich über die neue API integrieren lassen.


Rheinwerk Computing - Zum Seitenanfang

19.3.1 JavaScript-Programme ausführenZur nächsten ÜberschriftZur vorigen Überschrift

Bevor wir uns mit der Java-Seite beschäftigen, wollen wir ein kleines JavaScript-Programm schreiben. Es liest aus einer Variablen im Kontext, gibt etwas auf der Konsole aus und deklariert und initialisiert eine neue Variable.

Listing 19.12: com/tutego/insel/script/tutego.js

f = new javax.swing.JFrame()
f.setSize( 500, 100 )
f.defaultCloseOperation = javax.swing.JFrame.EXIT_ON_CLOSE
f.title = "Hallo " + name + "."
f.visible = true
today = new Date()
println( today )
month
= today.getMonth() + 1

Damit ein Java-Programm das Skript laden und ausführen kann, sind nur zwei Klassen nötig. Der ScriptEngineManager verschafft uns Zugang zu einer gewünschten Skript-Engine. Erfragt wird eine Skript-Engine über einen Namen (wie »JavaScript«) oder über einer Dateiendung, die die Skript-Dateien üblicherweise haben (wie »js«).

Listing 19.13: com/tutego/insel/script/JavaScriptDemo.java, Teil 1

package com.tutego.insel.script;

import java.io.InputStreamReader;
import javax.script.*;

public class ScriptDemo
{
public static void main( String[] args ) throws ScriptException
{
ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");

Die Methode getEngineByName() liefert ein ScriptEngine-Objekt, dessen eval()-Methoden die Interpretation starten.

Listing 19.14: com/tutego/insel/script/JavaScriptDemo.java, Teil 2

    engine.put( "name", "Christian Ullenboom" );
engine.eval( new InputStreamReader(
ScriptDemo.class.getResourceAsStream( "tutego.js" ) ) );
System.out.println( engine.get( "month" ) );
}
}

Ausgeführt stellt das Programm ein Swing-Fenster dar und gibt Folgendes auf der Konsole aus:

Hallo Christian Ullenboom.
Sun Jul 08 2007 15:25:12 GMT+0200 (CEST)
7.0

Rheinwerk Computing - Zum Seitenanfang

19.3.2 GroovyZur nächsten ÜberschriftZur vorigen Überschrift

Groovy (http://groovy.codehaus.org/) ist eine objektorientierte Skriptsprache, die auf einer JVM läuft und vollen Zugriff auf alle Java-Bibliotheken bietet. Die Sprache hat viele interessante Eigenschaften, die sie zu Java 2.0 machen – wenn wir die jetzige Version Java 1.7 nennen wollen. Groovy setzt auf der Standard-Java-Syntax auf und erweitert diese.[112](Bis auf sehr kleine Ausnahmen ist jedes Java-Programm ein Groovy-Programm.) Einige Höhepunkte:

Tabelle 19.3: Eigenschaften von Groovy mit Beispiel

Groovy-Feature Beispiel

Statt System.out.print()/println() reicht ein print bzw. println, und dann muss das Argument auch nicht in runden Klammern stehen.

println 1 + 2
print "Wow"

Anweisungen müssen nicht immer mit einem Semikolon abgeschlossen werden, sondern nur dann, wenn mehrere Anweisungen in einer Zeile stehen.

print "Wow"
print "Wow"; print "Wow"

Variablen müssen nicht mit einem Typ deklariert werden, das gilt auch bei catch oder Methoden/Konstruktoren.

def age = 40
def greet( name ) { print "Hallo " + name }
try { } catch ( e ) { }

Zeichenketten lassen sich mit einfachen oder doppelten Anführungszeichen angeben. Einzelne Zeichen (char/Character) müssen besonders aufgebaut werden.

print "Ja" == 'Ja'      // true
def sign = "-" as char

Strings in doppelten Anführungszeichen sind besondere GStrings: Enthalten sie $variable bzw. ${ausdruck}, so wird der Inhalt der Variablen bzw. der ausgewertete Ausdruck eingesetzt.

def one = 1
print "$one plus $one macht ${1+1}"
// 1 plus 1 macht 2

Strings können über mehrere Zeilen laufen, wenn sie in """ oder ''' eingeschlossen sind – folgt ein Backslash am Ende der Zeile, wird kein Zeilenumbruchzeichen eingefügt.

print """
Zeile 1
Zeile 2\
Weiter mit Zeile 2
"""

Alles ungleich 0 und null ist true.

if ( 1 ) print 'Zweig wird genommen'

Groovy definiert einen neuen Datentyp für Bereiche (engl. ranges).

def numbes = 0..9
def number = 0..<10

Erweiterte Zählschleife unter Berücksichtigung von Bereichen, bzw. rechts von in steht ein Iterable wie beim erweiterten for.

for ( i in 0..<10 )
print i // 0123456789

== bei Referenzen bedeutet equals()-gleich; ein Identitätsvergleich realisiert is().

def heinz = 'Heinz'
print heinz == 'Heinz' // true

Operatoren können überladen werden, und die Anwendung von Operatoren entspricht Methodenaufrufen, etwa + von plus(), ++ von next() oder [] von getAt().

println 1 + 2 * 3 // 7
println 1.plus(2).multiply(3) // 9
println 1.plus(2.multiply(3)) // 7

Alle Comparable-Objekte (und damit etwa String, BigInteger, BigDecimal) können mit ==, !=, <, >, <= und >= verglichen werden. Die Ordnung liefert compareTo().

def heinz = 'Heinz'
print heinz < 'Werner' // true

Ist in Java nur java.lang standardmäßig importiert, ist es bei Groovy viel mehr, etwa noch java.io, java.util, java.net und noch einige.

print new File('file.txt').exists()

Statt explizit auf Datenstrukturklassen für Listen und Mengen zurückzugreifen, bietet Groovy eine spezielle Syntax.

def primes = [ 2, 3, 5, 7]
print primes[ 0 ]
def dic = [ 'rot' : 'red', 'blau' : 'blue' ]
print dic['rot'] // red

Die Operatoren ?. und ?: (Elvis-Operator) verhindern null-Zugriffe.

def name = 'Chris'
println name ?: 'Kein Name' // Chris
name = null
println name ?: 'Kein Name' // Kein Name

Der Zugriff auf Zeichen über []ist bei den Zeichenkettenklassen String, StringBuffer, StringBuilder möglich.

def s = 'Ooog'
print s[0] // O

Der Zugriff über [] lässt auch Bereiche zu.

def s = "tutego"
print s[ 0, 1, 3..5 ] // tugeo
def t = new StringBuilder( "tutego" )
t[ 1..4 ] = "X"
print t // tXo

Der Operator << hängt Dinge an Strings (Rückgabe ist dann StringBuffer), Listen oder Dateien an.

def s = 'oger'
def sb = 'Das ist ' << s << ' oder?'
print sb // Das ist oger oder?
def file = new File("out.txt")
file << "Zeile 1"

Reguläre Ausdrücke werden mit einer eigenen Syntax direkt von der Sprache unterstützt; =~ ist ein find, ==~ ein match.

print '2010' ==~ /\d+/

Erweitertes switch-case etwa
mit regulären Ausdrücken und
Bereichen

switch ( 42 ) {
case 0..100 : println 'ist zwischen 0..100'; break
case Integer : println 'ist Integer'; break
case { it % 2 == 0 }: println 'ist gerade'; break
case ~/\d\d/: println '42 passt auf das Pattern'; break
}

Datentyp für Dauer und spezielle Eigenschaften für Datumswerte und überladene Operatoren zum leichten Rechnen mit dem Paket groovy.time

use ( groovy.time.TimeCategory ) {
def today = new Date()
def tomorrow = today + 1.day
print "Morgen: $tomorrow, nächstes Jahr ${today + 1.year}"
}

Closures als Codeblöcke werden unterstützt und finden überall in der Groovy-API Anwendung.

new File( "file.txt" ).eachLine {
println it
}
def names = [ "Charisma", " ", "Tina", "" ]
print names.findAll { ! it.trim().isEmpty() }
// [Charisma, Tina]

Setter/Getter müssen nicht aufgerufen werden; beim Zugriff ref.property wird automatisch der Setter/Getter aufgerufen.

def p = new Point( 10, 20 )
print p.location.x // 10.0

In Methoden mit Rückgabe kann das Schlüsselwort return entfallen.

def add( a, b ) { a + b }

Default-Parameter bei Methodendeklarationen

static tax( cost, taxRate = 19 ) {
cost * taxRate / 100
}
println tax( 100 ) // 19
println tax( 100, 7 ) // 7

Methoden und Klassen sind standardmäßig public, nicht paketsichtbar wir bei Java. Groovy erstellt automatisch Setter/Getter.

class Person { def  name }

Mit der Klassenannotation @Immutable wird ein Typ unveränderbar, mit @Singleton ein Singleton mit einem privaten Konstruktor und öffentlichen Attribut instance für die eine Instanz.

@Immutable class Pair { String val1, val2 }
@Singleton class AppWindow { }

Diverse Builder-Klassen erleichtern den Aufbau von hierarchischen XML- oder Swing-Bäumen ebenso wie Ant-Buildskripten.

import groovy.xml.MarkupBuilder
def writer = new StringWriter()
new MarkupBuilder( writer ).html {
head { title 'Zählen mit Graf Zahl' }
body {
h1 ( 'Willkommen' )
p {
ul { (1..10).each { li it } }
a( href:'''http://stupidedia.org/stupi/Graf_Zahl''',
'Graf Zahl' )
}
}
}
println writer

Groovy-Skripte in Eclipse ausführen

Um Groovy-Skripte und Programme auszuführen, bieten sich drei Wege an:

  • über eine spezielle Kommandozeile, die Groovy-Shell
  • über das Eclipse-Plugin
  • über die javax.script-API

Das Eclipse-Plugin unter http://groovy.codehaus.org/Eclipse+Plugin leistet gute Arbeit und wird ständig weiterentwickelt. Auf der Webseite ist der Update-Link genannt, sodass Groovy-Eclipse über den Update-Manager installiert werden kann.

  1. Wähle dazu Eclipse HelpInstall New Software...
  2. In der Dialogbox fülle das Textfeld bei Work with mit dem Link http://dist.codehaus.org/groovy/distributions/greclipse/snapshot/e3.7/ (bzw. anderen Versionen je nach Eclipse-Version) und aktivieren Add...
  3. Aktiviere anschließend Groovy-Eclipse, und führe die Installation mit Next usw. zu Ende.

Ist Eclipse neu gestartet und das Plugin installiert, kann jedes Java-Projekt um Groovy-Unterstützung erweitert werden. Bei einem Java-Projekt aktiviert die Aktion ConfigureConvert to Groovy Project im Kontextmenü genau diese Groovy-Unterstützung, sodass im Projektbaum die Groovy-Bibliotheken auftauchen.

FileNewOther... ermöglicht zum einen im Zweig Groovy das Erstellen eines neuen Groovy-Projekts (durch die Konvertierung eines existierenden Java-Projekts ist das nicht mehr nötig) und zum anderen mit Groovy Class das Erstellen einer Groovy-Klasse. Bei dieser Option lässt sich ein Paket- und Klassenname eingeben (etwa com.tutego.insel.script und GroovyBabe), und dann öffnet Eclipse den Groovy-Editor.

Löschen wir die Klassendeklaration und setzen nur die zwei Zeilen in die Datei:

Listing 19.15: com/tutego/insel/script/GroovyBabe.groovy

package com.tutego.insel.script
print "Hallo Groovy"

Ausgeführt wird das Groovy-Skript im Kontextmenü (oder Run-Menü) mit Run AsGroovy Skript.

Groovy über die Skript-API ausführen

Um Groovy als Skriptsprache aus einem Java-Programm heraus zu nutzen, können wir wieder auf die Skript-API zurückgreifen. Wenn es sich bei Eclipse schon um ein Groovy-Projekt handelt, ist ein Jar wie groovy-all-1.x.y.jar schon im Klassenpfad eingebunden, und es ist nichts ist zu tun. Andernfalls bekommen wir es von der Webseite http://groovy.codehaus.org/Download aus einem Zip-Archiv wie groovy-binary-1.8.1.zip, wo es im Ordner embeddable liegt.

Ein kleines Beispiel:

Listing 19.16: com/tutego/insel/script/GroovyDemo.java, main()

ScriptEngine engine = new ScriptEngineManager().getEngineByName( "groovy" );
System.out.println( engine.eval( "(1g..42g.gcd(56g)).sum()" ) ); // 105


Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
<< zurück
  Zum Katalog
Neuauflage: Java SE 8 Standard-Bibliothek
Neuauflage: Java SE 8 Standard-Bibliothek
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Professionell entwickeln mit Java EE 7






 Professionell
 entwickeln mit
 Java EE 7


Zum Katalog: Java ist auch eine Insel






 Java ist auch
 eine Insel


Zum Katalog: Einstieg in Eclipse






 Einstieg in Eclipse


Zum Katalog: Einstieg in Java






 Einstieg in Java


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2012
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de