(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