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