Java动态编译笔记
来源:互联网 发布:淘宝雷锋侠在哪申请 编辑:程序博客网 时间:2024/05/18 12:41
- import java.io.File;
- import java.net.URL;
- import java.net.URLClassLoader;
- import java.util.ArrayList;
- import java.util.List;
- import javax.tools.Diagnostic;
- import javax.tools.DiagnosticCollector;
- import javax.tools.JavaCompiler;
- import javax.tools.ToolProvider;
- import org.apache.log4j.Logger;
-
- public class DynamicEngine {
- private static Logger logger = Logger.getLogger(DynamicEngine.class);
- private static DynamicEngine instance =new DynamicEngine();
- private URLClassLoader parentClassLoader;
- private String classpath;
- public static DynamicEngine getInstance() {
- return instance;
- }
- private DynamicEngine() {
- this.parentClassLoader = (URLClassLoader) getClass().getClassLoader();
- buildClassPath();
- }
- private void buildClassPath() {
- StringBuilder sb = new StringBuilder();
- for (URL url : this.parentClassLoader.getURLs()) {
- String p = url.getFile();
- sb.append(p);
- sb.append(File.pathSeparator);
- }
- this.classpath = sb.toString();
- }
-
- @SuppressWarnings({ "rawtypes","unchecked" })
- public String javaCodeCompile(String className, String javaCode) {
- long start = System.currentTimeMillis();
- JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
- DiagnosticCollector diagListener = new DiagnosticCollector();
- ObjectFileManager fileManager = new ObjectFileManager(compiler.getStandardFileManager(diagListener,null, null));
- List<StringFileObject> compileUnits = new ArrayList<StringFileObject>(1);
- compileUnits.add(new StringFileObject(className, javaCode));
- List<String> options = new ArrayList<String>(4);
- options.add("-encoding");
- options.add("UTF-8");
- options.add("-classpath");
- options.add(this.classpath);
- JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagListener, options,null, compileUnits);
- boolean success = task.call().booleanValue();
- if (success) {
- long end = System.currentTimeMillis();
- logger.info("编译成功,用时:" + (end - start) + "ms");
- } else {
- StringBuilder error = new StringBuilder();
- for (Object diagnostic : diagListener.getDiagnostics()) {
- compilePrint(javaCode, error, (Diagnostic) diagnostic);
- }
- logger.error("编译失败:\n" + error);
- return error.toString();
- }
- return null;
- }