Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在运行时将rhino/javascript文件编译为java的.class字节码_Java_Javascript_Runtime_Compilation_Rhino - Fatal编程技术网

如何在运行时将rhino/javascript文件编译为java的.class字节码

如何在运行时将rhino/javascript文件编译为java的.class字节码,java,javascript,runtime,compilation,rhino,Java,Javascript,Runtime,Compilation,Rhino,我正在用爪哇做一份报告。我希望用户能够使用更简单的语言编写自己的引擎。掉落的沙子游戏可能非常CPU密集,所以我希望让引擎尽可能快地运行,而不必手动编译 我需要知道如何在运行时将rhino javascript文件编译成.class文件以供使用 我已经寻找了一种方法,但除了使用命令行手动编译之外,找不到其他方法。我不希望用户必须这样做。这里有一个简短的教程: 我的解决方案如下: 您可以在运行时使用Context.compileString()编译脚本。这将生成一个可以重用的脚本对象 Scrip

我正在用爪哇做一份报告。我希望用户能够使用更简单的语言编写自己的引擎。掉落的沙子游戏可能非常CPU密集,所以我希望让引擎尽可能快地运行,而不必手动编译

我需要知道如何在运行时将rhino javascript文件编译成.class文件以供使用


我已经寻找了一种方法,但除了使用命令行手动编译之外,找不到其他方法。我不希望用户必须这样做。

这里有一个简短的教程:

我的解决方案如下:

您可以在运行时使用Context.compileString()编译脚本。这将生成一个可以重用的脚本对象

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);
scripts=someContext.compileString(myScript,”,1,null);
//存储s,将其缓存在地图或其他东西中,甚至可能序列化并持久化它。
//后来。。。
对象结果=s.exec(另一个上下文,someScope);

像这样的东西与使用Context.evaluateString()之间的性能差异可能会快很多个数量级。

您可以尝试以下示例:

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

那么你基本上知道怎么做了?但您希望动态地完成此操作,并且用户不必担心将rhino脚本更改为.class?为此,您可以为他们提供一个批处理文件,以满足您的需要……本文中的代码示例有一个小缺陷,即调用函数
fib(num)应该位于它的定义后面。谢谢。本文明确指出,rhino无法将.js编译为.class,尽管它可以。