2010-10-02 9 views
6

Ich mache eine falling sand game in Java. Ich möchte, dass Benutzer ihre eigene Engine dafür schreiben können, indem sie eine einfachere Sprache verwenden. Falling Sand-Spiele können sehr CPU-intensiv sein, daher möchte ich, dass die Engine so schnell wie möglich ausgeführt wird, ohne manuell kompiliert werden zu müssen.Wie kompiliere ich Rhino/Javascript-Dateien zu .class Bytecode für Java zur Laufzeit

Ich muss wissen, wie Rhino-Javascript-Dateien zu .class-Dateien um zur Laufzeit zu verwenden, um verwendet werden.

Ich habe nach einem Weg gesucht, konnte aber nichts anderes finden, als manuell kompilieren es über die Befehlszeile, die ich nicht wollen, dass Benutzer tun müssen.

+0

So wissen Sie, im Grunde, wie es zu tun? aber Sie möchten, dass dies dynamisch erfolgt und der Benutzer sich nicht darum kümmern muss, Rhino-Skript in .class zu ändern? Dafür können Sie ihnen eine Batch-Datei zur Verfügung stellen, die Ihren Zweck erfüllen kann ... – Varun

Antwort

4

Es gibt eine kurze Anleitung hier:

+0

Das Codebeispiel in diesem Artikel hat einen kleinen Fehler, das ist der Aufruf der Funktion 'fib (num);' sollte hinter der Definition von stehen Das es . Vielen Dank. –

+0

Dieser Artikel besagt eindeutig, dass Rhino nicht .js zu .class kompilieren kann, obwohl es könnte. – peterh

1

Sie können Ihre Skripte zur Laufzeit mit Context.compileString() kompilieren. Dies erzeugt ein Script-Objekt, das Sie wiederverwenden können.

Script s = someContext.compileString(myScript, "<cmd>", 1, null); 

// Store s, cache it in a map or something, maybe even serialize and persist it. 

// Later... 

Object result = s.exec(anotherContext, someScope); 

Der Performance-Unterschied zwischen etwas wie dieses und mit Context.evaluateString() könnte leicht mehrere Größenordnungen schneller sein.

0

können Sie versuchen, die Folge Beispiel:

void toClassFile(String script) throws IOException { 
    CompilerEnvirons compilerEnv = new CompilerEnvirons(); 
    ClassCompiler compiler = new ClassCompiler(compilerEnv); 
    Object[] compiled = compiler.compileToClassFiles(script, null, 1, "javascript.Test"); 
    for(int j = 0; j != compiled.length; j += 2) { 
     String className = (String)compiled[j]; 
     byte[] bytes = (byte[])compiled[(j + 1)]; 
     File file = new File(className.replace('.', '/') + ".class"); 
     file.getParentFile().mkdirs(); 
     try (FileOutputStream fos = new FileOutputStream(file)) { 
      fos.write(bytes); 
     } 
    } 
}