2008年5月1日木曜日

javax.tools

このエントリーをはてなブックマークに追加
プログラムからプログラムをコンパイル&呼び出す方法について
(IEでソースをコピーすると改行が崩れるので,そういう人はFireFoxで)

実行環境:JDK 6

呼び出すプログラム


//Main.java

import java.io.File;

import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import javax.tools.JavaCompiler.CompilationTask;

import java.lang.reflect.Method;

public class Main {

// プログラムをコンパイルする
static void compile(String fileName) {
// 1. JavaCompiler インスタンスを取得.
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
if(compiler == null) {
System.out.println("Compiler is not provided.");
return;
}

// 2. java.io.File ベースのファイル・マネージャ.
StandardJavaFileManager fileManager =
compiler.getStandardFileManager(null, null, null);

// 3. コンパイルするソース・ファイル.
File[] sourceFiles = { new File(fileName + ".java") };

// 4. コンパイル・タスクを取得する.
CompilationTask task = compiler.getTask(
null, fileManager, null, null,
null, fileManager.getJavaFileObjects(sourceFiles));

// 5. コンパイル・タスクを実行し, 結果を表示する.
boolean result = task.call();
if(!result){
System.out.println("Compile error");
return;
}
}

// リフレクションを用いて,メソッドを呼び出す
static void reflect(String fileName , String methodName)
throws Exception{
// クラスを取得
Class cls = Class.forName(fileName);
// メソッドを取得
Method method = cls.getMethod(methodName,null);
// メソッドを実行
method.invoke(cls.newInstance(),null);
}

public static void main(String[] args) throws Exception {
if(args.length != 2){
System.out.println("%java -option Main FILENAME METHODNAME");
};

compile(args[0]);
reflect(args[0], args[1]);
}
}



呼び出されるプログラム

//Test.java

public class Test {
public void print(){
System.out.println("hello");
}
}


コンパイル 方法
C:\MyPrograms\Java\jdk1.6.0_03\libの部分は環境によって変える

set lib=C:\MyPrograms\Java\jdk1.6.0_03\lib
javac -cp .;%lib%\tools.jar Main.java
java -cp .;%lib%\tools.jar Main Test print


<参考URL>
javax.tools を使って動的アプリケーションを作成する
TECHSCORE