网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.用SQLJ开发数据库(2).
.组织SWT/JFace控件的利器:Layout.
.EasyJWeb-Velocity脚本简明教程.
.WebSphere应用服务器保护电子商务.
.Struts中关于用户权限限定的建议.
.主类型的过载.
.Collections API定制实现(一).
.常见的十四种Java开发工具及其特.
.如何在Web应用中启动后台任务.
.通过JDMK 进行遗留系统管理.
.Informix J/Foundation.
.一个Scocket实例程序.
.精通Hibernate之映射继承关系四(.
.Java Transaction API概述(1).
.jive中的abstract Factory.
.刚过了SCJP,分享我的体会!.
.保护Applet免遭窃取的小技.
.单例设计模式在Java中的应用.
.小议如何在Applet 中显示图象.
.Add 方法 (Dictionary).

调用Java编译器API编译Java

发表日期:2008-1-5


    从第一天开始,标准Java平台就缺少能够被调用,去产生Java字节码的编译器接口. 使用Sun实现的平台,一个用户可以通过非标准的 com.sun.tools.javac  包中的Main class 去编译你的代码 (你可以在lib子目录下的 tools.jar 文件里找到它). 然而这个包并没有提供一个标准的公开的编程接口. 使用其它实现的用户必然不能访问这个类. 使用Java SE 6和在JSR-199中定义的它的新的Java编译器接口,你可以从你自己的应用程序里访问javac编译工具了.

    有两种方式使用这种工具. 一种是简单的,一种是稍微复杂点但拥有更多选项的. 你首先将会用较简单的一种去编译 "Hello, World"程序,就是下面的这个:

public class Hello {
  public static void main(String args[]) {
    System.out.println("Hello, World");
  }
}

    要想从Java程序里调用Java编译器,你需要访问JavaCompiler 接口. 除此外,通过访问这个接口,你可以设置源代码的路径,classpath,和目标目录. 通过指定可编译的文件为 JavaFileObjectinstance ,你可以将它们全部编译. 然而,你并不需要对 JavaFileObject 了解多少.

    可以使用 ToolProvider 类去请求 theJavaCompiler 接口的缺省实现. 这个 ToolProvider 类提供了一个 getSystemJavaCompiler() 方法, 它返回一个 JavaCompiler 接口的实例.

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

使用 JavaCompiler 运行编译最简单的方法是调用在这个接口工具里定义的 run() 方法,它的实现是:

int run(InputStream in,
    OutputStream out,
    OutputStream err,
    String... arguments)

    分别为前三个缺省参数 System.in, System.out, and System.err 传入 null 值. 参数集 String 对象表示着传入编译器的文件的名称.

这样,你应该像下面这样去编译前面显示的 Hello 源程序:

int results = tool.run(null, null, null, "Hello.java");

    假设没有编译错误,这样会在目标目录里产生一个 Hello.class文件. 假如这里有错误, run() 方法会把它输出到标准错误输出流里,也就是 run()  方法的的第三个参数. 当错误发生时这个方法返回一个非0的结果.

你可以使用下面的代码去编译 Hello.java 源文件:


import java.io.*;
import javax.tools.*;

public class CompileIt {
  public static void main(String args[]) throws IOException {
    JavaCompiler compiler =
        ToolProvider.getSystemJavaCompiler();
    int results = compiler.run(
        null, null, null, "Hello.java");
    System.out.println("Result code: " + results);
  }
}

一旦你编译了 CompileIt 一次 ,你就可以多次运行它,当你修改了 Hello.java源程序时或者要重新编译它,你不需要重新编译 CompileIt . 假如没有错误,运行 CompileIt 会产生下面的输出:

> java CompileIt
Result code: 0


运行 CompileIt 同样也会在相同的目录下产生一个 Hello.class 文件:


> ls
CompileIt.class
CompileIt.java
Hello.class
Hello.java

    你可以完事了,因为这样使用标准编译器已经足够了,可是这还有更有用的. 当你需要更好的处理这些结果时,你可以使用第二种方法来访问编译器. 更非凡的是,这第二种方式答应开发者将编译输出结果用一种更有意义的方式表现出来,而不是简单的那种送往stdeer的错误文本. 利用 StandardJavaFileManager 类我们有这种更好的途径使用编译器. 这个文件治理器提供了一种方式,用来处理普通文件的输入输出操作. 它同时利用 DiagnosticListener 实例来报告调试信息. 你需要使用的 DiagnosticCollector 类其实是监听器的一种实现.


上一篇:Hibernate 3 Annotations 进阶 人气:753
下一篇:javascript实现划词标记+划词搜索功能 人气:592
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐