JDK 1.6 的 Java 编译器:如何将类字节直接写入byte[]数组?
-
22-09-2019 - |
题
所以我最近了解到了新的 Java编译器API 在 JDK 1.6 中可用。这使得编译一个非常简单 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();
您可以获取源代码 JavaSourceFromString
来自 Java文档.
这将非常方便地编译 sourceCode
到 Foo.class
在当前工作目录中。
我的问题是: :是否可以直接编译为 byte[]
数组,并避免处理的混乱 File
完全 I/O?
解决方案
也许你可以创建自己的javax.tools.JavaFileManager
实现类,你会回到自己的实现javax.tools.FileObject
然后将它写出来,而不是存储到磁盘。因此,对于你javax.tools.FileObject
Writer openWriter() throws IOException
方法的子类,你会返回一个java.io.StringWriter
。所有的方法应被转换为它们的对应String
不隶属于 StackOverflow