How to compile rhino/javascript files to .class bytecode for java at runtime

给你一囗甜甜゛ 提交于 2019-12-03 13:31:36

问题


I'm making a falling sand game in Java. I want users to be able to write their own engine for it using a simpler language. Falling sand games can be very CPU intensive so I want to have the engine running as fast as possible while not having to manually compile.

I need to know how to compile rhino javascript files to .class files by at runtime to be used.

I've looked for a way but couldn't find any other than manually compiling it by using the command line which I don't want users to have to do.


回答1:


There's a short tutorial here:

  • Scripting: Compiling Scripts in Java



回答2:


My solution here: Has anyone used or written an Ant task to compile (Rhino) JavaScript to Java bytecode?




回答3:


You can compile your scripts at runtime using Context.compileString(). This produces a Script object which you can reuse.

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

The performance difference between something like this and using Context.evaluateString() could easily be multiple orders of magnitude faster.




回答4:


You can try the follow sample:

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


来源:https://stackoverflow.com/questions/3843996/how-to-compile-rhino-javascript-files-to-class-bytecode-for-java-at-runtime

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!