package com.jk.compiler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URI;
import java.util.Arrays;
import javax.tools.JavaCompiler;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import javax.tools.JavaFileObject;
import javax.tools.JavaCompiler.CompilationTask;
/**
* 调用Java编译器进行动态编译
*/
public class CompileTest {
public static void main(String[] args) {
String className = "Calculator";
String methodName = "calculate";
String expression = "1+2+3";
String source = "package com.jk;public class " + className
+ "{ public static double " + methodName
+ "(){ return (double)" + expression + " ;}}";
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();// 需要使用jdk目录下的jre,否则无法获取到编译器
StandardJavaFileManager fileManager = compiler.getStandardFileManager(
null, null, null);
StringSourceJavaObject sourceObject = new CompileTest.StringSourceJavaObject(
className, source);
Iterable<? extends JavaFileObject> fileObjects = Arrays
.asList(sourceObject);
Iterable<String> options = Arrays.asList("-d", ".\\bin");// 指定类生成路径
CompilationTask task = compiler.getTask(null, fileManager, null,
options, null, fileObjects);
boolean results = task.call();
if (results) {
System.out.println("Compile successfully");
}
ClassLoader loader = CompileTest.class.getClassLoader();
try {
Class clazz = loader.loadClass("com.jk." + className);
Method mainMethod = clazz.getMethod(methodName, new Class<?>[] {});
Object value = mainMethod.invoke(null, new Object[] {});
System.out.println(value.toString());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
/**
* 通过String构造Java源文件
*
* @author 刘金魁
*
*/
private static class StringSourceJavaObject extends SimpleJavaFileObject {
private String content = null;
public StringSourceJavaObject(String name, String content) {
super(URI.create("string:///" + name.replace('.', '/')
+ Kind.SOURCE.extension), Kind.SOURCE);
this.content = content;
}
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
return content;
}
}
}
|