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
Download: - openbook, ca. 21,3 MB
Buch bestellen
Ihre Meinung?
<< zurück | Galileo Computing / <openbook> / Java 7 - Mehr als eine Insel | vor >>
Java 7 - Mehr als eine Insel von Christian Ullenboom Das Handbuch zu den Java SE-Bibliotheken
Java 7 - Mehr als eine Insel Galileo Computing 1433 S., 2012, geb. 49,90 Euro, ISBN 978-3-8362-1507-7 |
| 19 Dynamische Übersetzung und Skriptsprachen
|  | 19.1 Codegenerierung
|  |  | 19.1.1 Generierung von Java-Quellcode
|  |  | 19.1.2 Codetransformationen
|  |  | 19.1.3 Erstellen von Java-Bytecode
|  | 19.2 Programme mit der Compiler API übersetzen
|  |  | 19.2.1 Java Compiler API
|  |  | 19.2.2 Fehler-Diagnose
|  |  | 19.2.3 Eine im String angegebene Compiliationseinheit übersetzen
|  |  | 19.2.4 Wenn Quelle und Ziel der Speicher sind
|  | 19.3 Ausführen von Skripten
|  |  | 19.3.1 JavaScript-Programme ausführen
|  |  | 19.3.2 Groovy
|  | 19.4 Zum Weiterlesen
## 19.3 Ausführen von Skripten 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. ### 19.3.1 JavaScript-Programme ausführen 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
### 19.3.2 Groovy 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. Wähle dazu Eclipse Help • Install New Software... 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... 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 Configure • Convert to Groovy Project im Kontextmenü genau diese Groovy-Unterstützung, sodass im Projektbaum die Groovy-Bibliotheken auftauchen. File • New • Other... 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 As • Groovy 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 | <top> | vor >>
Zum Katalog
Java 7 – Mehr als eine Insel Jetzt bestellen
Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen? Ihre Meinung
Buchempfehlungen
| Java und XML
| Einstieg in Eclipse 3.7
| Android 3
| NetBeans Platform 7
| Java ist auch eine Insel
| Apps entwickeln für Android 4
| Java 7
Shopping
Versandkostenfrei bestellen in Deutschland und Österreich Info

Copyright © Galileo Press 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.

[Galileo Computing]
Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de