Java 作为 Java 的脚本语言?

问题描述 投票:0回答:9

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

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

所以我认为将java本身改编为java程序的脚本语言应该为我提供最好的性能和兼容性。

有什么建议吗?

java performance scripting jvm
9个回答
10
投票

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

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

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


8
投票

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


8
投票

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
 二进制文件的路径。


6
投票
答案是“是”,您可以在 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


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

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

import javax.tools.JavaCompiler; import javax.tools.ToolProvider; JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); if(compiler!=null) { .... }
    

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 类似,但速度更快。


2
投票
对于简单的事情,当 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
    


0
投票
截至 2017 年底,Java 已通过

jshell

 发展到包含一些基本的 shell/脚本类型的功能。

© www.soinside.com 2019 - 2024. All rights reserved.