如何接受和执行任意Java代码

如何接受和执行任意Java代码,java,Java,许多网站允许用户输入Java代码并运行它。程序如何接受外部/运行时编写的Java并运行它 我在StackOverflow上看到的唯一/最接近的答案是5年前关于Android开发的,该开发建议使用Janino()。还是这样吗?在过去的五年中,是否出现了更好的方法(比如Java内置的东西) 如果有用的话,我正在为我的学生开发一个培训应用程序。代码很短(有几个方法,最多20行),它们必须使用标准库(无需担心从maven导入东西等) 与类似的在线编码站点一样,我希望返回运行(或编译失败)的输出 一个示例

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

我在StackOverflow上看到的唯一/最接近的答案是5年前关于Android开发的,该开发建议使用Janino()。还是这样吗?在过去的五年中,是否出现了更好的方法(比如Java内置的东西)

如果有用的话,我正在为我的学生开发一个培训应用程序。代码很短(有几个方法,最多20行),它们必须使用标准库(无需担心从maven导入东西等)

与类似的在线编码站点一样,我希望返回运行(或编译失败)的输出

一个示例用例:

  • 网页上显示“下面的代码有错误,请尝试修复。”文本框包含代码。缺少分号
  • 用户修改代码并按submit
  • 该网页返回编译错误消息或成功

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

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

    导入java.io.File;
    导入java.lang.reflect.Method;
    导入java.net.URL;
    导入java.net.URLClassLoader;
    导入javax.tools.JavaCompiler;
    导入javax.tools.ToolProvider;
    公共类编译器{
    公共静态void main(字符串[]args)引发异常{
    //编译java文件
    JavaCompiler=ToolProvider.getSystemJavaCompiler();
    int result=compiler.run(null,null,null,“D:\\development\\snippets\\Test.java”);
    System.out.println(“编译器结果”+结果);
    //加载新类
    File classesDir=新文件(“D:\\development\\snippets\\”;
    URLClassLoader classLoader=URLClassLoader.newInstance(新URL[]{classesDir.toURI().toURL()});
    Class cls=Class.forName(“Test”,true,classLoader);
    //通过反射调用类的方法
    对象实例=cls.getDeclaredConstructors()[0].newInstance();
    方法testMethod=cls.getMethod(“测试”);
    String testMethodResult=(String)testMethod.invoke(实例);
    System.out.println(testMethodResult);
    }
    }
    
    这里是测试课

    公共类测试{
    公共字符串测试(){
    返回“来自测试的字符串。”;
    }
    }
    
    运行
    编译器
    类返回

    编译器结果0
    来自测试的字符串。
    
    您可以编写一个脚本来调用
    javac
    ,或者这不适合您的用例吗?有多种方法可以做到这一点,包括显而易见的,只需使用
    javac
    java
    来编译和运行。但是JDK也有一个编译器接口(就像Java 6?),请确保您正确地设置了安全性。这段代码可以像编写的一样工作(一个独立的项目)。它在我的Springboot项目中不起作用。我错过了什么把戏吗?错误:
    请求处理失败;嵌套异常为org.mdkt.compiler.compileationException:无法编译源代码[kind=WARNING,line=2,message=无法初始化javac处理器,原因是(很可能是)类加载器问题:java.lang.NoClassDefFoundError:com/sun/tools/javac/processing/JavacProcessingEnvironment
    应用程序是在相同的环境中运行还是使用不同的JRE?我可以想象,如果只安装了一个没有编译器的独立JRE,这个类是不可用的。但公平地说,我对Sp不太熟悉ringboot,所以我真的不知道。