【问题标题】:Is there an equivalent to Python's exec() function in Java?Java 中是否有与 Python 的 exec() 函数等效的函数?
【发布时间】:2016-06-28 16:30:05
【问题描述】:

在python中,你可以使用exec()来执行一段代码。

在 Java 中有什么方法可以做到这一点,这样我就可以从字符串调用函数,还可以做其他事情——比如获取一些用户输入并将其作为 Java 代码运行。

注意:这和Is there an eval() function in Java?不一样;这只适用于eval(),而我想要exec()

【问题讨论】:

  • 您可能会在这里找到答案:*.com/questions/3716991/…
  • @ThorbjørnRavnAndersen,Andrew,Ray - 这与流程执行无关......
  • 人们似乎对exec() 在 Python 中所做的事情感到困惑。简短摘要:它需要一个带有 Python 源代码的字符串,编译它并在运行的解释器中执行它。
  • 不容易。有javax.tools 包,但它很乱,需要安装JDK(一个真正的编译器)才能工作。如果你只需要在你的程序中执行一些代码,我建议javax.script,它允许JavaScript执行。
  • 您是否首先尝试搜索?看起来像许多重复:*.com/questions/6051884/…*.com/questions/2946338/…*.com/questions/1064259/…

标签: java eval


【解决方案1】:

你有几个选择

1) 动态编译和加载一个java类

How do you dynamically compile and load external java classes?

就像 Peter Lawrey 建议使用 net.openhft.compiler 你可以做你想做的事

https://github.com/OpenHFT/Java-Runtime-Compiler

// dynamically you can call
String className = "mypackage.MyClass";
String javaCode = "package mypackage;\n" +
                 "public class MyClass implements Runnable {\n" +
                 "    public void run() {\n" +
                 "System.out.println(\"Hello World\");\n" +
                 "     }\n" +
                 "}\n";
Class aClass = CompilerUtils.CACHED_COMPILER.loadFromJava(className, javaCode);
Runnable runner = (Runnable) aClass.newInstance();
runner.run();

我测试了这个解决方案,它运行良好。

注意:你需要在你的项目中添加依赖 ${env.JAVA_HOME}/lib/tools.jar

2) 在您的 Java 中使用另一种语言来解释您的代码,例如使用 Jython:

String arbitraryPythonCode = "";
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec(arbitraryPythonCode);

您还可以使用 Javascript、Groovy、Scala 等。

【讨论】:

  • 谢谢!接受为答案