使用JDK1.6编译器API动态编译java源代码实例

来源:互联网 发布:mysql集群架构 编辑:程序博客网 时间:2024/05/22 15:56
package test;


import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;


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


/**
 * 使用java编译器API动态编译java源文件实例
 * @author gyang
 *
 */
public class T1 {


/**
* @param args
*/
public static void main(String[] args) throws Exception {
//java源文件中须显示定义一个无参构造函数
String javaSource = "public class TestMain{public TestMain(){} public static void main(String[] args) {System.out.println(\"Hello World!\");} public void say(String words){System.out.println(words);}}";

//编译器函数接口

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager javaFileManager = compiler.getStandardFileManager(null, null, null);
StringSourceJavaObject sourceObject = new T1.StringSourceJavaObject("TestMain", javaSource);
Iterable<? extends JavaFileObject> fileObjects = Arrays.asList(sourceObject);
CompilationTask task = compiler.getTask(null, javaFileManager, null, null, null, fileObjects);
boolean result = task.call();
if(result){
System.out.println("编译成功!");

Class c = Class.forName("TestMain");
Object o = c.newInstance();
Method m = c.getMethod("main", String[].class);
m.invoke(o, new Object[]{new String[]{}});//调用main函数

m = c.getDeclaredMethod("say", String.class);
m.invoke(o, "hahahahha!");//调用自定义函数
}
}

static class StringSourceJavaObject extends SimpleJavaFileObject{


private String content = null;
public StringSourceJavaObject(String name, String content) throws URISyntaxException {
super(URI.create("string:///" + name.replace('.', '/') + Kind.SOURCE.extension), Kind.SOURCE);
this.content = content;
}

@Override
   public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
    return content;
   }
}

}


运行结果:



原创粉丝点击