gpt4 book ai didi

java - 如何接受并执行任意Java代码

转载 作者:行者123 更新时间:2023-12-01 22:18:12 24 4
gpt4 key购买 nike

许多网站允许用户输入 Java 代码并运行它。程序如何接受外部/运行时编写的Java并运行它?

我在 StackOverflow 上看到的唯一/最接近的答案是 5 年前关于 Android 开发的内容,建议使用 Janino ( Compile and execute arbitrary Java string in Android )。这仍然是要走的路吗?在过去的五年中是否出现了更好的方法(例如 Java 中内置的方法)?

如果有帮助,我正在为我的学生构建一个培训应用程序。代码很短(一些方法,最多可能 20 行),并且必须使用标准库(无需担心从 Maven 导入内容等)。

像类似的在线编码网站一样,我想返回运行的输出(或编译失败)。

示例用例:

  1. 网页显示“下面的代码有错误,请尝试修复它。”文本框包含代码。缺少一个分号。
  2. 用户修改代码并按提交。
  3. 网页要么返回编译错误消息,要么返回成功。

另一个用例是我对他们提交的代码执行单元测试并返回结果。重点是,我向用户提供有关代码编译/运行的反馈。

最佳答案

这是一个使用 Java 编译器接口(interface)的小示例

import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;

public class Compiler {

public static void main(String[] args) throws Exception {
// compile the java file
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int result = compiler.run(null, null, null, "D:\\development\\snippets\\Test.java");
System.out.println("compiler result " + result);

// load the new class
File classesDir = new File("D:\\development\\snippets\\");
URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { classesDir.toURI().toURL() });
Class<?> cls = Class.forName("Test", true, classLoader);

// invoke a method of the class via reflection
Object instance = cls.getDeclaredConstructors()[0].newInstance();
Method testMethod = cls.getMethod("test");
String testMethodResult = (String) testMethod.invoke(instance);
System.out.println(testMethodResult);
}
}

这里是测试类

public class Test {
public String test() {
return "String from test.";
}
}

运行Compiler类返回

compiler result 0
String from test.

关于java - 如何接受并执行任意Java代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58611272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com