Java 不创建物理文件的动态编译
我遵循来自的教程,代码是可以工作的,但我看到的是程序将在编译后创建一个类文件Java 不创建物理文件的动态编译,java,file,java-compiler-api,jsr199,Java,File,Java Compiler Api,Jsr199,我遵循来自的教程,代码是可以工作的,但我看到的是程序将在编译后创建一个类文件 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 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;
}
}
import java.io.IOException;
导入java.net.URI;
导入java.util.array;
导入java.util.Locale;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.tools.JavaCompiler.CompilationTask;
导入javax.tools.*;
公共类编译器{
静态最终记录器=Logger.getLogger(Compiler.class.getName());
静态字符串sourceCode=“class HelloWorld{”
+“公共静态void main(字符串args[]){”
+System.out.println(\“您好,动态编译世界!\”)
+ "}"
+ "}";
公开作废文件(){
SimpleJavaFileObject fileObject=新的DynamicJavaSourceCodeObject(“HelloWorld”,sourceCode);
JavaFileObject javaFileObjects[]=新的JavaFileObject[]{fileObject};
JavaCompiler=ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager stdFileManager=compiler.getStandardFileManager(null,Locale.getDefault(),null);
Iterable对于您的工作,我会使用。仅使用JavaCompiler
似乎是可行的,但没有很好的文档记录。有关如何使用JavaCompiler的示例,请参阅我添加的注释和E链接问题
编辑:
我发现使用JavaCompiler
很容易理解,对于您的工作,我会使用它。仅使用JavaCompiler
似乎是可行的,但没有很好的文档记录。有关使用JavaCompiler的示例,请参阅我添加的注释和E链接问题
编辑:
我发现使用JavaCompiler
可以很容易理解,避免由JavaCompiler创建类文件,使用参数:“-proc:only”避免由JavaCompiler创建类文件,使用参数:“-proc:only”关联到:可能的重复关联到:可能的重复