14

是否可以将 Java 用作 Java 的脚本语言?或者也许在运行时以某种方式将java脚本编译成java二进制文件?我确实尝试过搜索,但除了一些黑客之外找不到任何全面的东西......

我有其他语言的经验,例如对于 C#,我使用了非常方便的 lua,但现在我需要实现最大的性能,因为对脚本的调用大约为每帧 1.000.000。

因此,我认为将 java 本身改编为 java 程序的脚本语言应该为我提供最佳的性能和兼容性。

有什么建议么?

4

8 回答 8

8

BeanShell是一种常用的 Java 脚本解决方案。它是一种非常类似于 Java 的脚本语言。

存在其他使用 Java 基础架构和 JVM,但使用不同语言的解决方案。例如 Scala、Groovy 和 Jython(一种与 Java 兼容的 Python)。所有这些要实现的重要一点是,它们将与使用标准 Java 创建的 Java 库进行互操作,因此您可以简单地使用(例如)Scala 来驱动您的 Java 语言创建的解决方案。

以上都提供了一个 REPL ( read-eval-print-loop ),因此您可以在动态命令行环境中导入、实例化对象并与之交互。这对于测试和原型交互以及测试脚本非常有用。

于 2012-12-06T16:06:05.520 回答
7

您可以为此使用 BeanShell,但 Groovy、XTend 和 Scala 可能会做出更好的选择。

于 2012-12-06T16:05:53.510 回答
5

答案是“是的”,您可以在 Java 程序本身中使用 Java 作为脚本语言。此外,还有其他几种语言也可以用于此目的——Javascript、LUA、Groovy、Ruby,这个列表很长。引入 javax.scripting API 使集成变得更加容易,它标准化并极大地简化了将第三方脚本语言集成到 Java 程序中的过程。我强烈建议阅读 API 和 Oracles 页面上的一些教程。

http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html

于 2012-12-06T16:09:21.807 回答
4

您可以使用 JANINO http://docs.codehaus.org/display/JANINO/Home ...一个轻量级的“嵌入式”JavaTM 编译器,将内存中的简单程序编译成 JavaTM 字节码,在运行程序的 JVM 中执行...请参阅示例http://docs.codehaus.org/display/JANINO/Basic

或者您可以使用 MVEL http://mvel.codehaus.org/ 它类似于 BeanShell,但要快得多。

于 2013-01-20T19:41:51.223 回答
4

从 7.0 版开始,Java 对运行时编译有了“官方”支持(如果 SDK 中的 tools.jar 在类路径上)。大概,执行速度可以和编译的java一样高,高于解释器。

阅读起点(互联网上的许多示例):

import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;


JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
if(compiler!=null) {
    .... 
}
于 2015-08-13T15:21:40.310 回答
4

Java 11 支持无需编译即可运行源代码。

对于HelloWorld.java包含

public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello World!!!");
  }
}

你可以跑

java HelloWorld.java

执行代码。有一个限制:必须在同一个文件中定义所有类。

如果文件没有.java扩展名,则需要包含--source选项。

例如,对于HelloWorld包含您需要运行的源代码的文件

java --source 11 HelloWorld.

要直接在 shell 中运行 java“脚本”,您可以使用

#!/usr/bin/java --source 11

public class HelloWorld {
  public static void main (String[] args) {
    System.out.println("Hello World")
  }
}

哪里/usr/bin/javajava二进制的路径。

于 2018-08-15T19:38:37.067 回答
1

对于当 groovy 等不可用时的简单内容,我将 java 嵌入到 bash 脚本中,如项目java-script-template中所述。代码如下所示:

#!/bin/bash
set -e
TEMP_DIRECTORY=/tmp
TEMPFILE=`mktemp $TEMP_DIRECTORY/ScriptXXXXX|sed -e 's/\.//g'`
CLASS_NAME=`basename "$TEMPFILE"`
JAVA_SOURCE=$TEMPFILE.java
cat <<EOF >$JAVA_SOURCE.tmp

//Write your java class here with a main method
//Be sure to leave the name of the class as Script 

//import some commonly used imports
import java.io.*;
import java.text.*;
import java.util.*;

public class Script {

    public static void main(String[] args) throws Exception {
       System.out.println("Here's a test run for you");
    }

}

EOF

## change the name of the class to match the file
sed "s/public class Script /public class $CLASS_NAME /g" $JAVA_SOURCE.tmp >$JAVA_SOURCE

## compile the java
javac $JAVA_SOURCE 

## run the class using all passed in parameters from the command line
java -classpath $TEMP_DIRECTORY $CLASS_NAME
于 2014-05-07T05:40:53.010 回答
0

RelProxy是一个运行中的 Java 编译器(在内存中),它使 Java 感觉像是一种脚本语言,但没有任何限制。当 Groovy 在 Java 环境中使用时,它还支持 Groovy 类的热类重载。

于 2014-02-15T11:42:50.880 回答