Vì vậy, gần đây tôi đã học về JavaCompiler API mới có sẵn trong JDK 1.6. Điều này làm cho nó rất đơn giản để biên dịch một String
đến một .class
tập tin trực tiếp từ mã chạy:JavaCompiler từ JDK 1.6: cách viết byte lớp trực tiếp vào mảng byte []?
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();
Bạn có thể lấy các nguồn để JavaSourceFromString
từ Javadoc.
Thao tác này sẽ rất dễ dàng biên soạn sourceCode
thành Foo.class
trong thư mục làm việc hiện tại.
Câu hỏi của tôi là: là nó có thể biên dịch thẳng vào một mảng byte[]
, và tránh sự hỗn độn đối phó với File
I/O hoàn toàn?