频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

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

来源:天极开发 作者:极地圣火 出处:巧巧读书 2007-01-15 进入讨论组
上一页 1 2 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;
 }
}
收藏地址:http://www.qqread.com/java/2007/01/w293366.html 更多文章 更多内容请看Java环境安装配置Java编程开发手册Java的类专题,或进入讨论组讨论。
上一页 1 2 3 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章