动态编译.java文件

来源:互联网 发布:java开发实战经典下载 编辑:程序博客网 时间:2024/06/10 19:07

前两天遇到一个数据计算问题,数据计算公式有时候可能会变,考虑用动态生成.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对象,进行计算了。

0 0
原创粉丝点击