是否可以将Java用作Java的脚本语言?或者在运行时以某种方式将Java脚本编译成Java二进制文件?我尝试过搜索,但除了一些hack之外,找不到任何综合性的内容...
我有使用其他语言的经验,例如对于C#,我使用了lua,这非常方便,但现在我需要达到最大的性能,因为每帧调用脚本约为1,000,000次。
所以我想到将Java本身适应为Java程序的脚本语言,这应该为我提供最佳的性能和兼容性。
有什么建议吗?
是否可以将Java用作Java的脚本语言?或者在运行时以某种方式将Java脚本编译成Java二进制文件?我尝试过搜索,但除了一些hack之外,找不到任何综合性的内容...
我有使用其他语言的经验,例如对于C#,我使用了lua,这非常方便,但现在我需要达到最大的性能,因为每帧调用脚本约为1,000,000次。
所以我想到将Java本身适应为Java程序的脚本语言,这应该为我提供最佳的性能和兼容性。
有什么建议吗?
BeanShell 是 Java 常用的脚本解决方案。它是一种非常类似于 Java 的脚本语言。
还有其他使用 Java 基础设施和 JVM,但使用不同语言的解决方案。例如,Scala、Groovy 和 Jython(Java 兼容的 Python)。需要注意的是,所有这些解决方案都可以与使用标准 Java 创建的 Java 库进行交互操作,因此您可以轻松地使用(例如)Scala 驱动您使用 Java 语言创建的解决方案。
上述所有解决方案都提供 REPL (read-eval-print-loop),以便您可以在动态命令行环境中导入、实例化和交互操作您的对象。这对于测试和原型交互以及测试脚本非常有用。
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/java
是 java
二进制文件的路径。
http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
if(compiler!=null) {
....
}
在一些简单的情况下,当没有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
RelProxy是一个即时(内存中)编译Java的编译器,它让Java感觉像脚本语言一样,但没有任何限制。当Groovy在Java环境中使用时,它还支持Groovy类的热加载。