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

前端之家收集整理的这篇文章主要介绍了JDK 1.6的JavaCompiler:如何将类字节直接写入byte []数组?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我最近了解到JDK 1.6中提供的新 JavaCompiler API.这使得直接从运行代码将String编译为.class文件变得非常简单:
  1. String className = "Foo";
  2. String sourceCode = "...";
  3.  
  4. JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
  5.  
  6. List<JavaSourceFromString> unitsToCompile = new ArrayList<JavaSourceFromString>()
  7. {{
  8. add(new JavaSourceFromString(className,sourceCode));
  9. }};
  10.  
  11. StandardJavaFileManager fileManager = compiler.getStandardFileManager(null,null,null);
  12. compiler.getTask(null,fileManager,unitsToCompile).call();
  13. fileManager.close();
  14.  
  15. ByteArrayOutputStream bos = new ByteArrayOutputStream();
  16. FileInputStream fis = new FileInputStream(className + ".class");
  17. IoUtils.copyStream(fis,bos);
  18.  
  19. 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对应物.

猜你在找的Java相关文章