使用 javax.tools.JavaCompiler 在内存中完全编译代码
我正在使用 javax.tools 包 (JDK 1.7) 中的 JavaCompiler 来即时编译一些东西,如下所示:
I'm using the JavaCompiler from the javax.tools package (JDK 1.7) to compile some stuff on the fly, like this:
compiler.run(null, null, "-cp", paths, "path/to/my/file.java");
它可以工作,但我想在内存中完成所有操作(例如,传递带有代码的字符串,而不是源文件,并取回字节码而不是 .class 文件).我发现扩展 InputStream
和 OutputStream
参数没有用,因为它可能与控制台中的相同.你知道一种让 run 方法像这样工作的方法吗?或者您是否知道使用 getTask()
方法执行此操作的确认方法?(扩展 FileManager 看起来很容易,但没那么容易 :)
It works but I would like to do it all in memory (e.g. pass a string with the code, not the source file, and get the byte code back not a .class file). I found that extending the InputStream
and OutputStream
parameters is no use since it's probably just the same as in the console. Do you know a way to make the run method work like this? Or do you know a confirmed way to do this with the getTask()
method? (extending the FileManager looks easy but isn't that easy :)
我已经在 Mac OS Java 7 中运行了上述代码.它们都不起作用.所以我写了一个https://github.com/trung/InMemoryJavaCompiler
I've run the above code in Mac OS Java 7. None of them works. So i wrote one https://github.com/trung/InMemoryJavaCompiler
StringBuffer sourceCode = new StringBuffer();
sourceCode.append("package org.mdkt;
");
sourceCode.append("public class HelloClass {
");
sourceCode.append(" public String hello() { return "hello"; }");
sourceCode.append("}");
Class<?> helloClass = InMemoryJavaCompiler.compile("org.mdkt.HelloClass", sourceCode.toString());