来自JDK 1.6的JavaCompiler:如何将类字节直接写入byte []数组?

Geo*_*old 8 java compilation in-memory jsr199

所以我最近了解到JDK 1.6中提供的新JavaCompiler API.这使得直接从运行代码编译String.class文件变得非常简单:

String className = "Foo";
String sourceCode = "...";

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

List<JavaSourceFromString> unitsToCompile = new ArrayList<JavaSourceFromString>() 
    {{ 
         add(new JavaSourceFromString(className, sourceCode)); 
    }};

StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
compiler.getTask(null, fileManager, null, null, null, unitsToCompile).call();
fileManager.close();    

ByteArrayOutputStream bos = new ByteArrayOutputStream();
FileInputStream fis = new FileInputStream(className + ".class");
IOUtils.copyStream(fis, bos);

return bos.toByteArray();
Run Code Online (Sandbox Code Playgroud)

您可以JavaSourceFromStringJavadoc获取源代码.

这将非常方便地编译sourceCodeFoo.class当前工作目录中.

我的问题是:是否可以直接编译到byte[]数组,并避免File完全处理I/O 的混乱?

man*_*unk 3

也许您可以创建自己的javax.tools.JavaFileManager实现类,在其中返回您自己的实现,javax.tools.FileObject然后将其写入内存而不是磁盘。因此,对于方法的子类,javax.tools.FileObject Writer openWriter() throws IOException您将返回一个java.io.StringWriter. 所有方法都应转换为其String对应方法。