Java动态编译
2016-07-25 09:11
302 查看
方法一 使用process
方法二 使用JavaCompiler
上面2种都是要吧源代码保存到本地,然后在使用javac编译,下面那种方法可以在内存中编译并且返回。
方法三
public String compile(String command) throws Exception{ Process process = null; try { process = Runtime.getRuntime().exec(command); } catch (Exception e) { return "系统正在维护中"; } InputStream is = null; BufferedReader br = null; try { is = process.getErrorStream(); StringBuilder sb = new StringBuilder(); br = new BufferedReader(new InputStreamReader(is, "gbk")); String line = null; while ((line = br.readLine()) != null) { sb.append(line); System.out.println(line); sb.append("\n"); } process.waitFor(); return sb.toString(); } catch (Exception e) { throw e; } finally { try { if (null != is) { is.close(); is = null; } if (null != br) { br.close(); br = null; } if (null != process) { process.destroy(); process = null; } } catch (Exception e) { throw e; } } }
方法二 使用JavaCompiler
public String compileJava(String path) throws Exception { // String command = "javaxc -encoding utf-8 "+ path; // return compile(command); JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); OutputStream outStream = new ByteArrayOutputStream(); OutputStream errStream = new ByteArrayOutputStream(); int result = compiler.run(null, null, errStream, "-encoding", "utf-8", path); StringBuilder sb = new StringBuilder(); String s = ""; if(result > 0) { s = errStream.toString(); } return s; }
上面2种都是要吧源代码保存到本地,然后在使用javac编译,下面那种方法可以在内存中编译并且返回。
方法三
public String compileJava(String source) throws Exception { JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>(); MyFileManager fileManager = new MyFileManager(compiler.getStandardFileManager(diagnostics, null, null)); List<JavaFileObject> jfiles = new ArrayList<JavaFileObject>(); jfiles.add(new SourceJavaFileObject("Main", source)); List<String> options = new ArrayList<String>(); options.add("-encoding"); options.add("UTF-8"); JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, options, null, jfiles); boolean success = task.call(); if (success) { ClassJavaFileObject jco = fileManager.getFileObject(); DynamicClassLoader dynamicClassLoader = new DynamicClassLoader(); Class clazz = dynamicClassLoader.loadClass("Main", jco); ContextUtil.map.put("Main", clazz); System.out.println(clazz); return "编译成功"; } else { String error = ""; for (Diagnostic diagnostic : diagnostics.getDiagnostics()) { error = error + compilePrint(diagnostic); } return error; } }
public class ClassJavaFileObject extends SimpleJavaFileObject{ protected final ByteArrayOutputStream bos = new ByteArrayOutputStream(); public ClassJavaFileObject(String name, JavaFileObject.Kind kind) { super(URI.create(name + kind.extension), kind); } public byte[] getBytes() { return bos.toByteArray(); } @Override public OutputStream openOutputStream() throws IOException { return bos; } }
public class SourceJavaFileObject extends SimpleJavaFileObject{ private CharSequence content; public SourceJavaFileObject(String className, CharSequence content) { super(URI.create(className+JavaFileObject.Kind.SOURCE.extension), Kind.SOURCE); // super(URI.create("string:///" + className.replace('.', '/') // + JavaFileObject.Kind.SOURCE.extension), JavaFileObject.Kind.SOURCE); this.content = content; } @Override public CharSequence getCharContent( boolean ignoreEncodingErrors) { return content; } }
public class MyFileManager extends ForwardingJavaFileManager { private ClassJavaFileObject fileObject; public ClassJavaFileObject getFileObject() { return fileObject; } public void setFileObject(ClassJavaFileObject fileObject) { this.fileObject = fileObject; } public MyFileManager(StandardJavaFileManager javaFileManager) { super(javaFileManager); } @Override public JavaFileObject getJavaFileForOutput(Location location, String className, JavaFileObject.Kind kind, FileObject sibling) throws IOException { fileObject = new ClassJavaFileObject(className, kind); return fileObject; } }
相关文章推荐
- Javah生成JNI文件
- Spring data jpa配置出错
- java NIO实现同步非阻塞服务器
- Hadoop:Java API实现
- spring+quartz实现定时任务(每天零点删除指定文件夹中缓存文件)
- SpringMVC 的第一个程序——HelloWorld
- Java自动内存管理机制(一) JVM、Class
- Jetty NIO模型
- Java 测试,按字节数截取字符串,不能输出半个中文
- 研读代码必须掌握的Eclipse快捷键
- 关于eclipse中同步代码报错checkout conflict with files的解决方法
- 解决Java调用dmp批处理不弹出cmd实施黑框
- Struts2中的ModelDriven机制及其运用
- Java中对象和对象引用
- java中string与byte[]的转换
- 工作流activiti 5.13基本的API流程
- eclipse中的Console控制台视图脱离主窗口解决办法
- Spring改版后的下载
- java Socket编程 服务器和客户端执行的顺序问题
- 【转】SpringMVC Controller 介绍