Niedawno dowiedziałem się o nowej wersji JavaCompiler API dostępnej w JDK 1.6. To sprawia, że bardzo łatwo sporządzić String
się do .class
plik bezpośrednio z kodu działa:JavaCompiler z JDK 1.6: jak pisać bajty klas bezpośrednio do tablicy bajtów []?
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();
Można pobrać źródła do JavaSourceFromString
z Javadoc.
To bardzo wygodnie skompiluje sourceCode
do Foo.class
w bieżącym katalogu roboczym.
Moje pytanie brzmi:: czy jest to możliwe do kompilacji prosto do byte[]
tablicy i uniknąć niechlujstwo radzenia sobie z File
I/O w ogóle?