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

所以我最近了解到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,unitsToCompile).call();
fileManager.close();    

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

return bos.toByteArray();

您可以从Javadoc获取JavaSourceFromString的源代码.

这将非常方便地将sourceCode编译为当前工作目录中的Foo.class.

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

解决方法

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

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写:&#160;一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...