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);}}";
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;
}
}
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;
}
}
}
运行结果: