这是编译代码:
public static void compileAll(File file) throws IOException{
String fileToCompile = "C:/test.java";
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
FileOutputStream errorStream = new FileOutputStream("Errors.txt");
int compilationResult = compiler.run(null, null, errorStream, "-verbose", fileToCompile );
if(compilationResult == 0){
System.out.println("Compilation is successful");
}else{
System.out.println("Compilation Failed");
}
}
问:有没有办法使用JavaCompiler原样编译class文件?是的:根据需要创建虚拟方法和/或虚拟类,以便可以编译:)
f
”或“调用方法
foo
”;编译器必须说“加载类型为
f
的字段
double
”或“调用类型为
f
的方法
int(double, Object)
”。考虑读取对象的未知字段并将其分配给
double
局部变量:
double d = o.f;
如果
f
的类型是
double
,编译器将简单地使用
getfield
后跟
dstore
到
d
的局部变量槽中。 如果
f
的类型为
int
,编译器将在
i2d
和
getfield
之间发出
dstore
指令,将
int
转换为
double
。 如果
f
的类型为
Double
,编译器将发出对
doubleValue()
的调用,以在存储加载的值之前将其拆箱。 如果
f
是
Object
类型,则在没有强制转换的情况下,在 Java 中赋值是非法的(如果合法的话,这将是
checkcast
指令)。 如果
x
的类没有名为
x
的字段,则此作业无法翻译。在调用具有未知签名的方法时,也适用类似的注意事项,这可能需要对其每个参数进行转换和/或为可变参数调用创建数组。 此外,在 JVM 级别,允许返回类型重载,因此即使只有一个参数类型列表,也必须指定返回类型。
您能做的最好的事情就是提供未知类的虚拟声明,以便编译器知道要做什么,正如 paulsm4 的答案所建议的那样。