栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

是否可以通过编程方式仅在内存中编译Java源代码?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

是否可以通过编程方式仅在内存中编译Java源代码?

首先,请看JavaCompiler
API
。基本上:

  1. 在字符串中创建Java类。
  2. 将字符串放入扩展SimpleJavaFileObject的类中。
  3. 使用
    JavaCompiler
    实例进行编译。

最后,将方法称为新类。


这是与JDK6
+一起使用的示例:

import java.io.IOException;import java.io.PrintWriter;import java.io.StringWriter;import java.lang.reflect.InvocationTargetException;import java.net.URI;import java.util.Arrays;import javax.tools.Diagnostic;import javax.tools.DiagnosticCollector;import javax.tools.JavaCompiler;import javax.tools.JavaFileObject;import javax.tools.SimpleJavaFileObject;import javax.tools.ToolProvider;import javax.tools.JavaCompiler.CompilationTask;import javax.tools.JavaFileObject.Kind;public class CompileSourceInMemory {  public static void main(String args[]) throws IOException {    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();    DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();    StringWriter writer = new StringWriter();    PrintWriter out = new PrintWriter(writer);    out.println("public class HelloWorld {");    out.println("  public static void main(String args[]) {");    out.println("    System.out.println("This is in another java file");");        out.println("  }");    out.println("}");    out.close();    JavaFileObject file = new JavaSourceFromString("HelloWorld", writer.toString());    Iterable<? extends JavaFileObject> compilationUnits = Arrays.asList(file);    CompilationTask task = compiler.getTask(null, null, diagnostics, null, null, compilationUnits);    boolean success = task.call();    for (Diagnostic diagnostic : diagnostics.getDiagnostics()) {      System.out.println(diagnostic.getCode());      System.out.println(diagnostic.getKind());      System.out.println(diagnostic.getPosition());      System.out.println(diagnostic.getStartPosition());      System.out.println(diagnostic.getEndPosition());      System.out.println(diagnostic.getSource());      System.out.println(diagnostic.getMessage(null));    }    System.out.println("Success: " + success);    if (success) {      try {        Class.forName("HelloWorld").getDeclaredMethod("main", new Class[] { String[].class }) .invoke(null, new Object[] { null });      } catch (ClassNotFoundException e) {        System.err.println("Class not found: " + e);      } catch (NoSuchMethodException e) {        System.err.println("No such method: " + e);      } catch (IllegalAccessException e) {        System.err.println("Illegal access: " + e);      } catch (InvocationTargetException e) {        System.err.println("Invocation target: " + e);      }    }  }}class JavaSourceFromString extends SimpleJavaFileObject {  final String pre;  JavaSourceFromString(String name, String pre) {    super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension),Kind.SOURCE);    this.pre = pre;  }  @Override  public CharSequence getCharContent(boolean ignoreEncodingErrors) {    return pre;  }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/514933.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号