我的类中有以下(简化)代码,它调用Java编译器来处理给定的源文件:
package test;
import javax.tools.*;
public class SimpleCompileTest {
public static void main(String[] args) {
String fileToCompile = "MyClass.java";
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int compilationResult = compiler.run(null, null, null, fileToCompile);
if(compilationResult == 0){
System.out.println("Compilation is successful");
} else {
System.out.println("Compilation Failed");
}
}
}
编译成功,但现在我如何获得MyClass.java的结果,如何运行这个编译的代码。
答案 0 :(得分:0)
package javacompiler;
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
public class COmpilerHello {
public static void main(String[] args)
{
String s="C:/Users/MariaHussain/Desktop/hussi.java";
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int result = compiler.run(System.in,System.out,System.err,s);
System.out.println("Compile result code = " + result);
}
}
看到结果变量的各种值如0,1 2显示编译状态,是否编译
答案 1 :(得分:0)
获取JavaFileManager,设置位置以保存.class文件,然后通过(自定义)类加载器加载它:
StandardJavaFileManager stdFileManager = compiler.getStandardFileManager(null, Locale.getDefault(), null);
stdFileManager.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(new File("classDir")));
+ custom classloader
或者没有存储: JavaCompiler from JDK 1.6: how to write class bytes directly to byte[] array?
你指向的地方: https://weblogs.java.net/blog/2008/12/17/how-compile-fly
其中主要思想是使用自定义MemoryFileManager作为JavaFileManager。