kramann.info
© Guido Kramann

Login: Passwort:










Script-Verarbeitung in Java

  • An kleinen Beispielen soll Schritt für Schritt die Benutzung von Java-Reflection beschrieben werden.
javascriptengine.zip - nachfolgende Beispiele.

Elementare Benutzung der eines ScriptEngine-Objektes

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

public class Script1
{
    public static void main(String[] args)
    {
        ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
        engine.put("x","45");
        engine.put("y","15");
        try
        {
//            engine.eval("z=abs(x)+180*Math.sin(x)/Math.PI;");
//            engine.eval("z=Math.abs(x)+Math.abs(y);");
//            engine.eval("z=Math.abs(0)+x+y;");

              String skript = "function funk(Zahl) { return Zahl*Zahl }";
//              engine.eval(skript+"\nz=funk(7);");               
              engine.eval(skript);               
              engine.eval("z=funk(7);");               
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
        Object z = engine.get("z");
        System.out.println(z.toString());
    }
}

Code 7-1: Elementare Benutzung der eines ScriptEngine-Objektes.

Handhabung von Arrays

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

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

        String skript = "";
        skript += "var f = new Array(2);\n";
        skript += "f[0]=1;\n";
        skript += "f[1]=2;\n";
        skript += "var x = f[0]+f[1];\n";

        try
        {
            engine.eval(skript);
        }
        catch(Exception e)
        {
            System.out.println(e);
        }

        Object x = engine.get("x");
        System.out.println(x.toString());
    }
}

Code 7-2: Handhabung von Arrays.

Beschreibung eines DGLS als Skript und dessen Integration

import java.io.InputStreamReader;
import javax.script.*;
import java.lang.reflect.Array;

import sun.org.mozilla.javascript.NativeArray;

public class Script3
{
    public static String wandleArray(double[] arr)
    {
        StringBuffer erg = new StringBuffer();
        erg.append("new Array(");

        for(int i=0;i<arr.length;i++)
        {
            erg.append(arr[i]+"");
            if(i<arr.length-1)
                erg.append(",");
        }

        erg.append(")");

        return erg.toString();
    }

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

        StringBuffer sb = new StringBuffer();

        sb.append("var f = new Array(2);\n");
        sb.append("var C = 1.0;\n");
        sb.append("var D = 0.1;\n");
        sb.append("function rechteSeite(y,t)\n");
        sb.append("{\n");
        sb.append("    y    = eval(y);\n");
        sb.append("    f[0] = y[1];\n");
        sb.append("    f[1] = -C*y[0]-D*y[1];\n");
        sb.append("    return f;\n");
        sb.append("}\n");


        //Funktion und Parameter bereitstellen:
        try
        {
            engine.eval(sb.toString());
        }
        catch(Exception e)
        {
            System.out.println(e);
        }

        //Rechte Seite über das Euler-Verfahren auswerten:
        NativeArray ff = null;
        double[] y = new double[] {1.0,0.0};
        double[] rechteSeite = new double[] {0.0,0.0};
        double   t = 0.0;
        double  dt = 0.05;

        for(int tt=0;tt<100;tt++)
        {
            try
            {
                ff = (NativeArray)(  engine.eval("rechteSeite("+wandleArray(y)+","+t+")")  );
            }
            catch(Exception e)
            {
                System.out.println(e);
            }

            for(int i=0;i<ff.getLength();i++)
                rechteSeite[i] = Double.parseDouble( ff.get(i,null).toString() );

            y[0]+=rechteSeite[0]*dt;
            y[1]+=rechteSeite[1]*dt;

            System.out.println(t+" "+y[0]);

            t+=dt;
        }
    }
}

Code 7-3: Beschreibung eines DGLS als Skript und dessen Integration.

Übung
  • Weiter unten sehen Sie ein elementares Programm "Textladen", um Strings zu laden und zu speichern.
  • Schreiben Sie auf Grundlage von Textladen und Skript3 ein Simulationsprogramm, das das zu integrierende Modell aus einer Textdatei holt, in der es als Skript vorliegt.
  • Als weitere Variante soll nun das Modell über ein TextArea-Feld in einem Applet eingegeben werden.
  • Auf Knopfdruck soll dann eine Simulation davon durchgeführt werden.
  • Die Ergebnisse sollen als Plot angezeigt werden.
  • Alternativ sollen die Zeitverläufe der Zustandsgrößen an ein anderes Applet geschickt werden und dort angezeigt werden.
import java.io.*;
public class Textladen
{
    public static void main(String[] args)
    {
        if( !( new File("vorname.txt") ).exists() )
        {
            BufferedReader pufferleser  = new BufferedReader(new InputStreamReader( System.in ));
            System.out.println("Geben Sie bitte Ihren Vornamen ein (mit ENTER bestaetigen):");
            try
            {
                speichern( pufferleser.readLine() );
            }
            catch(IOException e) { }
        }
        try
        {
            FileReader meinLeser = new FileReader( new File("vorname.txt") );
            StringBuffer puffer  = new StringBuffer();            
            int zeichen = meinLeser.read();            
            while( zeichen!=-1 )
            {
                puffer.append((char)zeichen);
                zeichen = meinLeser.read();                
            }
            System.out.println("Hallo "+puffer.toString()+"!");
            meinLeser.close();
        }
        catch(IOException e) { }        
    }
    public static void speichern(String vorname)
    {
        try
        {
            PrintWriter  meinPrinter   = new PrintWriter( new FileWriter(new File("vorname.txt")) );            
            meinPrinter.print(vorname);            
            meinPrinter.close();   
        }
        catch(IOException e) { }
    }
}

Code 7-4: Klasse Textladen.