0

私は現在、ユーザー入力に基づいて使用する Java クラス ファイルを出力するツールを作成しています。一連の .java ファイルを出力しました。そのうちのいくつかは、現在のコンテキストに存在しないクラスと変数を参照しています。このため、コンパイルすると、出力ファイルにこれらのエラーが記録され、クラスがコンパイルされません。私の質問は、JavaCompiler を使用してクラス ファイルをそのままコンパイルする方法はありますか?

コンパイルコードは次のとおりです。

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");
    }
}
4

2 に答える 2

0

What you want is not possible, because the Java compiler needs to know the types as well as the names of variables and methods at bytecode generation time. Because Java bytecode is typed and some Java-source-level conversions are not known to the JVM (e.g., unboxing conversion is purely a Java compiler convention), the compiler cannot get away with emitting bytecode that says "load field f" or "call method foo"; the compiler must say "load field f of type double" or "call method f of type int(double, Object)".

Consider reading an unknown field of an object and assigning it to a double local variable:

double d = o.f;

If the type of f is double, the compiler will simply use a getfield followed by a dstore into the local variable slot for d. If f is of type int, the compiler will emit an i2d instruction between the getfield and dstore to convert the int to a double. If f is of type Double, the compiler will emit a call to doubleValue() to unbox the loaded value before storing it. If f is of type Object, the assignment is illegal in Java without a cast (which would be a checkcast instruction if it were legal). If the class of x doesn't have a field named x, there's no possible translation for this assignment.

Similar considerations apply when calling a method with unknown signature, which may require conversions for each of its arguments and/or creating an array for a varargs call. Further, at the JVM level, overloading on return type is allowed, so even if there's only one list of argument types, the return type must also be specified.

The best you can do is provide dummy declarations of the unknown classes so the compiler knows what to do, as suggested by paulsm4's answer.

于 2014-06-21T01:24:41.600 に答える
0

Q: JavaCompiler を使用してクラス ファイルをそのままコンパイルする方法はありますか?

はい: コンパイルできるように、必要に応じてダミー メソッドやダミー クラスを作成します :)

于 2012-06-06T23:04:59.023 に答える