前两天遇到一个数据计算问题,数据计算公式有时候可能会变,考虑用动态生成.java文件,然后动态去加载.class文件的方法去解决,先做一下记录,以备用时查看:
import javax.tools.JavaCompiler;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import java.net.URI;
import java.util.Arrays;
public class ComputeService {
public boolean compile(String formulate,String packageName,String className){
if(null == formulate || "".equals(formulate)){
return false;
}
StringBuffer sb = new StringBuffer();
sb.append("package ");
sb.append(packageName + ";");
sb.append("\n");
sb.append("public class " );
sb.append(className);
sb.append("{");
sb.append("public void compute(){");
sb.append(formulate);
sb.append("}}");
String classPath = Thread.currentThread().getContextClassLoader().getResource("//").getPath();
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
JavaStringFileObject fileObject = new JavaStringFileObject(className,sb.toString());
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null,null,null);
JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, null, Arrays.asList("-d", classPath), null, Arrays.asList(fileObject));
return task.call();
}
class JavaStringFileObject extends SimpleJavaFileObject{
private String javaSource;
public JavaStringFileObject(String className,String javaSource){
super(URI.create(className + ".java"), Kind.SOURCE);
this.javaSource = javaSource;
}
public CharSequence getCharContent(boolean ignoreEncodingErrors){
return javaSource;
}
}
}
当java文件编译完成并加载后,就可以用java反射生成java对象,进行计算了。