Как скомпилировать файлы Rhino / Javascript в байт-код .class для Java во время выполнения - PullRequest
6 голосов
/ 02 октября 2010

Я делаю игру с падающим песком на Java. Я хочу, чтобы пользователи могли писать свой собственный движок для него, используя более простой язык. Падающие песочные игры могут сильно загружать процессор, поэтому я хочу, чтобы двигатель работал как можно быстрее, без необходимости ручной компиляции.

Мне нужно знать, как скомпилировать файлы javascript для Rhino в файлы .class во время использования.

Я искал способ, но не мог найти ничего, кроме ручной компиляции с помощью командной строки, чего я не хочу, чтобы пользователи делали.

Ответы [ 4 ]

4 голосов
/ 02 октября 2010

Здесь есть краткое руководство:

2 голосов
/ 03 октября 2010
1 голос
/ 19 января 2012

Вы можете скомпилировать свои скрипты во время выполнения, используя Context.compileString ().Это создает объект Script, который вы можете использовать повторно.

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);

Разница в производительности между чем-то вроде этого и использованием Context.evaluateString () может быть на несколько порядков быстрее.

0 голосов
/ 19 апреля 2015

Вы можете попробовать следующий пример:

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 );
        }
    }
}
...