package li.compiler;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
public class Demo {
public static void main(String[] args) throws Exception {
String source = "public class Test{public void sayHi(){System.err.println(\"你好\");}}";
String type = "Test";
String func = "sayHi";
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager javaFileManager = javaCompiler.getStandardFileManager(null, null, null);
JavaFileObject javaFileObject = new StringJavaObject(type, source);
List<String> options = new ArrayList<String>();
// options.addAll(Arrays.asList("-Xlint:unchecked"));
List<JavaFileObject> javaFileObjects = Arrays.asList(javaFileObject);
CompilationTask compilationTask = javaCompiler.getTask(null, javaFileManager, null, options, null, javaFileObjects);
if (compilationTask.call()) {
Class<?> clazz = Class.forName(type);
Object target = clazz.newInstance();
Method method = clazz.getMethod(func);
method.invoke(target);
}
}
}
class StringJavaObject extends SimpleJavaFileObject {
private String source;
protected StringJavaObject(String type, String source) {
super(URI.create("String:///" + type + Kind.SOURCE.extension), Kind.SOURCE);
this.source = source;
}
public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
return this.source;
}
}