Динамическая компиляция без создания физического файла
Я следую учебнику изДинамическое создание классов Java с помощью API компилятора Javaкод работает, но я вижу, что программа создаст файл класса после его компиляции.
<code>import java.io.IOException; import java.net.URI; import java.util.Arrays; import java.util.Locale; import java.util.logging.Level; import java.util.logging.Logger; import javax.tools.JavaCompiler.CompilationTask; import javax.tools.*; public class Compiler { static final Logger logger = Logger.getLogger(Compiler.class.getName()); static String sourceCode = "class HelloWorld{" + "public static void main (String args[]){" + "System.out.println (\"Hello, dynamic compilation world!\");" + "}" + "}"; public void doCompilation() { SimpleJavaFileObject fileObject = new DynamicJavaSourceCodeObject("HelloWorld", sourceCode); JavaFileObject javaFileObjects[] = new JavaFileObject[]{fileObject}; JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager stdFileManager = compiler.getStandardFileManager(null, Locale.getDefault(), null); Iterable<? extends JavaFileObject> compilationUnits = Arrays.asList(javaFileObjects); DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>(); CompilationTask compilerTask = compiler.getTask(null, stdFileManager, diagnostics, null, null, compilationUnits); boolean status = compilerTask.call(); if (!status) { for (Diagnostic diagnostic : diagnostics.getDiagnostics()) { System.out.format("Error on line %d in %s\n", diagnostic.getLineNumber(), diagnostic); } } try { stdFileManager.close(); } catch (IOException ex) { Logger.getLogger(Compiler.class.getName()).log(Level.SEVERE, null, ex); } } public static void main(String args[]) { new Compiler().doCompilation(); } } class DynamicJavaSourceCodeObject extends SimpleJavaFileObject { private String qualifiedName; private String sourceCode; protected DynamicJavaSourceCodeObject(String name, String code) { super(URI.create("string:///" + name.replaceAll("\\.", "/") + JavaFileObject.Kind.SOURCE.extension), JavaFileObject.Kind.SOURCE); this.qualifiedName = name; this.sourceCode = code; } @Override public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException { return sourceCode; } public String getQualifiedName() { return qualifiedName; } public void setQualifiedName(String qualifiedName) { this.qualifiedName = qualifiedName; } public String getSourceCode() { return sourceCode; } public void setSourceCode(String sourceCode) { this.sourceCode = sourceCode; } } </code>
Возможно ли, что после звонкаcompilerTask.call();
не создать файл класса? Если да, как это сделать?