是否可以使用Java作为java的脚本语言?或者也许以某种方式在运行时将java脚本编译成java二进制文件?我确实尝试过搜索,但除了一些黑客之外找不到任何全面的内容......
我有使用其他语言的经验,例如对于 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),以便您可以在动态命令行环境中导入、实例化对象并与对象交互。这对于测试和原型交互以及测试脚本非常有用。
您可以使用 BeanShell 来实现此目的,但 Groovy、XTend 和 Scala 可能会做出更好的选择。
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
二进制文件的路径。
阅读的起点(互联网上有很多示例):
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
if(compiler!=null) {
....
}
http://docs.codehaus.org/display/JANINO/Home ...一个轻量级的“嵌入式”JavaTM 编译器,它将内存中的简单程序编译为 JavaTM 字节码,该字节码在正在运行的程序的 JVM 中执行... 请参阅示例 http://docs.codehaus.org/display/JANINO/Basic
或者您可以使用 MVELhttp://mvel.codehaus.org/ 它与 BeanShell 类似,但速度更快。
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
jshell
发展到包含一些基本的 shell/脚本类型的功能。