在Java中是否有与Python的exec()函数相同的功能?

时间:2016-03-13 18:16:25

标签: java eval

在python中,您可以使用public interface ReportGenerator { void generateReport(ReportParameter reportParameter) } @Component public class ConcreteReportGenerator { @Override @Transactional //**If concrete method is annotated transaction then bean not instantiating** void generateReport(ReportParameter reportParameter) { //Concrete Implementation } } 来执行一段代码。

是否有任何方法可以在Java中执行此操作,以便我可以从字符串中调用函数,但也可以执行其他操作,例如获取一些用户输入并将其作为Java代码运行。

注意:这与Is there an eval() function in Java?不同;这只是org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type[...ConcreteReportGenerator ] 而我想要exec()

1 个答案:

答案 0 :(得分:3)

你有几个选择

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等