使用javax.tools.JavaCompiler 在内存中完全编译代码

参见英文答案 > How do you dynamically compile and load external java classes?                                     2个
我正在使用javax.tools包(JDK 1.7)中的JavaCompiler来动态编译一些东西,如下所示:

compiler.run(null, null, "-cp", paths, "path/to/my/file.java");

它可以工作,但我想在内存中完成所有操作(例如,传递带代码的字符串,而不是源文件,并获取字节代码而不是.class文件).我发现扩展InputStream和OutputStream参数没有用,因为它可能与控制台中的相同.你知道一种让run方法像这样工作的方法吗?或者您是否知道使用getTask()方法执行此操作的确认方法? (扩展FileManager看起来很简单但不是那么容易:)

解决方法:

我在Mac OS Java 7中运行了上述代码.它们都不起作用.所以我写了一个
https://github.com/trung/InMemoryJavaCompiler

StringBuffer sourceCode = new StringBuffer();
sourceCode.append("package org.mdkt;\n");
sourceCode.append("public class HelloClass {\n");
sourceCode.append("   public String hello() { return \"hello\"; }");
sourceCode.append("}");

Class<?> helloClass = InMemoryJavaCompiler.compile("org.mdkt.HelloClass", sourceCode.toString());
上一篇:lombok自定义扩展实践


下一篇:注释仅在源级别为5.0语法错误java时可用