参见英文答案 > 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());