その場でクラスをコンパイルする方法を探してみましたが、コンパイル済みの Class インスタンスを作成するようになりました。ただし、実行可能な .class ファイルを作成できるようにしたいと考えています。可能であれば、Class オブジェクトを .class ファイルに出力するにはどうすればよいでしょうか。これが正しくない場合は、どうすればこれを行うことができるかを説明してください。
2 に答える
0
しないでください。代わりに実行可能な jar を作成してください。
必要なものが実行可能 jar ではないと感じた場合は、ここで概説されている他のオプションがあります。
于 2012-05-03T04:17:52.340 に答える
0
このページhttp://www.accordess.com/wpblog/an-overview-of-java-compilation-api-jsr-199/ では、文字列から Java コードをコンパイルして .class ファイルを生成するプロセスについて説明しています。これは、そのページの他の点で適切にコメントされたコードの短縮版です。
public class CompilerAPITest {
final Logger logger = Logger.getLogger(CompilerAPITest.class.getName()) ;
/** Java source code to be compiled dynamically */
static String sourceCode = "package com.accordess.ca;" +
"class DynamicCompilationHelloWorld{" +
"public static void main (String args[]){" +
"System.out.println (\"Hello, dynamic compilation world!\");" +
"}" +
"}" ;
/* Object initialization and compilation. */
public void doCompilation (){
SimpleJavaFileObject fileObject = new DynamicJavaSourceCodeObject ("com.accordess.ca.DynamicCompilationHelloWorld", 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);
//This example places the output files under bin folder.
String[] compileOptions = new String[]{"-d", "bin"} ;
Iterable<String> compilationOptions = Arrays.asList(compileOptions);
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
CompilationTask compilerTask = compiler.getTask(null, stdFileManager, diagnostics, compilationOptions, null, compilationUnits) ;
boolean status = compilerTask.call();
if (!status){//If compilation error occurs
for (Diagnostic diagnostic : diagnostics.getDiagnostics()){
System.out.format("Error on line %d in %s", diagnostic.getLineNumber(), diagnostic);
}
}
try {
stdFileManager.close() ;//Close the file manager
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String args[]){
new CompilerAPITest ().doCompilation() ;
}
}
class DynamicJavaSourceCodeObject extends SimpleJavaFileObject{
private String qualifiedName ;
private String sourceCode ;
protected DynamicJavaSourceCodeObject(String name, String code) {
super(URI.create("string:///" +name.replaceAll("\\.", "/") + Kind.SOURCE.extension), Kind.SOURCE);
this.qualifiedName = name ;
this.sourceCode = code ;
}
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors)
throws IOException {
return sourceCode ;
}
// ... getters and setters
}
于 2012-05-03T04:58:02.480 に答える