科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Java SE6调用Java编译器的两种新方法

Java SE6调用Java编译器的两种新方法

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在很多Java应用中需要在程序中调用Java编译器来编译和运行。但在早期的版本中(Java SE5及以前版本)中只能通过tools.jar中的com.sun.tools.javac包来调用Java编译器。

作者:中国IT实验室 来源:中国IT实验室 2007年9月30日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共3页)

三、从内存中编译

   JavaCompiler不仅可以编译硬盘上的Java文件,而且还可以编译内存中的Java代码,然后使用reflection来运行它们。我们可以编写一个JavaSourceFromString类,通过这个类可以输入Java源代码。一但建立这个对象,你可以向其中输入任意的Java代码,然后编译和运行,而且无需向硬盘上写.class文件。


import java.lang.reflect.*;
import java.io.*;
import javax.tools.*;
import javax.tools.JavaCompiler.CompilationTask;
import java.util.*;
import java.net.*;

public class test_compilerapi
{
  private static void compilerJava() throws Exception
  {
   JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
   DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
   // 定义一个StringWriter类,用于写Java程序
   StringWriter writer = new StringWriter();
   PrintWriter out = new PrintWriter(writer);
   // 开始写Java程序
   out.println("public class HelloWorld {");
   out.println(" public static void main(String args[]) {");
   out.println(" System.out.println(\"Hello, World\");");
   out.println(" }");
   out.println("}");
   out.close();
   //为这段代码取个名子:HelloWorld,以便以后使用reflection调用
   JavaFileObject file = new JavaSourceFromString("HelloWorld", writer.toString());
   Iterable<? extends JavaFileObject> compilationUnits = Arrays.asList(file);
   JavaCompiler.CompilationTask task = compiler.getTask(null, null,
    diagnostics, null, null, compilationUnits);
   boolean success = task.call();
   System.out.println("Success: " + success);
   // 如果成功,通过reflection执行这段Java程序
   if (success)
   {
    System.out.println("-----输出-----");
    Class.forName("HelloWorld").getDeclaredMethod("main", new Class[]
            { String[].class }).invoke(null, new Object[]
            { null });
    System.out.println("-----输出 -----");
   }
  }
  public static void main(String args[]) throws Exception
  {
   compilerJava();
  }
}
// 用于传递源程序的JavaSourceFromString类
class JavaSourceFromString extends SimpleJavaFileObject
{
  final String code;
  JavaSourceFromString(String name, String code)
  {
   super(URI.create("string:///" + name.replace('.', '/')+ Kind.SOURCE.extension), Kind.SOURCE);
   this.code = code;
  }
  @Override
  public CharSequence getCharContent(boolean ignoreEncodingErrors)
  {
   return code;
  }
}

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章