java下第八章编译器API.ppt_第1页
java下第八章编译器API.ppt_第2页
java下第八章编译器API.ppt_第3页
java下第八章编译器API.ppt_第4页
java下第八章编译器API.ppt_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八章 编译器API 学习目标 编译器概述,了解API能够实现的功能。 能够熟练使用ToolProvider获得系统默认编 译器,并动态完成编译操作。 熟练应用StandardJavaFileManager管理相 关的输入和输出,以及编译非文本文件。 能够运用DiagnosticListener监听、收集编 译过程中的诊断信息。 范例导入 程序代码的自我复制和自我修改是一种非常 强大的能力,但这种能力常被滥用来制造病 毒,以至于现代操作系统通常不允许修改程 序的代码段和禁用调用栈的执行权限来保证 代码的安全性。这使得通过修改自身代码来 实现某种逻辑的合理编程方法受到了限制。 而JDK 1.6赋予了程序员在运行时刻产生并 编译Java源代码的能力,这和Java的反射机 制结合在一起,使得Java程序可以在运行过 程中产生新类,替换旧类,动态修改自身组 件以进行自适应优化运行时刻的性能。 编译器API概述 - 1 JDK 1.6 提供了在运行时调用编译器的 API,后面我们将假设把此 API 应用在 JSP 技术中。在传统的 JSP 技术中,服务器处理 JSP 通常需要进行下面六个步骤:、分析 JSP 代码、生成 Java 代码、将 Java 代码写 入存储器、启动另外一个进程并运行编译器 编译 Java 代码、将类文件写入存储器、服 务器读入类文件并运行; 但如果采用运行时编译,可以同时简化步 骤 4 和 5,节约新进程的开销和写入存储器 的输出开销,提高系统效率。 编译器API概述 - 2 新 API 的第二个新特性是可以编译抽象 文件,理论上是任何形式的对象,只要该对 象实现了特定的接口。 第三个新特性是可以收集编译时的诊断信 息。 由此可见编译器API产生主要是面向热部 署或者增量编译这样的场合,目的是增强 Java和JVM的交互性。 ToolProvider类 ToolProvider类为找出Tool提供了方法, 例如,编译器的提供者。 成员方法: public static JavaCompiler getSystemJavaCompiler() public static ClassLoader getSystemToolClassLoader() Tool接口 Tool接口是JavaCompiler接口的父接口, 定义了命令行工具的共同的接口。 成员方法: public Set getSourceVersions() public int run(InputStream in, OutputStream out, OutputStream err, String. arguments) 动态编译练习 练习:编写一个java源文件Hello.java,然 后写一段代码完成对Hello.java文件的动态 编译和运行。程序清单:Hello.java 。 public class Hello public static void main(String args) System.out.println(“Hello World!“); System.out.println(“你好,世界!“); 使用StandardJavaFileManager编译-1 JDK 1.6 的编译器 API 强大之处在于,它 可以编译的源文件的形式并不局限于文本文 件。JavaCompiler 类依靠文件管理服务可以 编译多种形式的源文件。比如直接由内存中 的字符串构造的文件,或者是从数据库中取 出的文件。 如果要使用 JavaFileManager,就必须构 造 CompilationTask。JDK 1.6 提供了 JavaCompiler.CompilationTask 类来封装一个 编译操作。这个类可以通过JavaCompiler的 getTask方法得到。 使用StandardJavaFileManager编译-2 JavaCompiler接口代表Java的编译器,方 法如下: public StandardJavaFileManager getStandardFileManager( DiagnosticListener diagnosticListener, Locale locale,Charset charset) 使用StandardJavaFileManager编译-3 public JavaCompiler.CompilationTask getTask(Writer out, JavaFileManager fileManager, DiagnosticListener diagnosticListener, Iterable options, Iterable classes, Iterable compilationUnits) 使用StandardJavaFileManager编译-4 JavaFileManager.Location描述文件对象地 址,用于由文件管理器确定安置或搜寻文件 对象。方法如下: public String getName() public boolean isOutputLocation() 使用StandardJavaFileManager编译-5 StandardLocation枚举是 JavaFileManager.Location接口的实现。 public static final StandardLocation ANNOTATION_PROCESSOR_PATH public static final StandardLocation CLASS_OUTPUT public static final StandardLocation CLASS_PATH 使用StandardJavaFileManager编译-6 public static final StandardLocation PLATFORM_CLASS_PATH public static final StandardLocation SOURCE_OUTPUT public static final StandardLocation SOURCE_PATH 使用StandardJavaFileManager编译-7 JavaFileManager是文件管理器,这个类可 以很好地控制输入、输出。它为运行在JVM 编程语言来源和类文件的工具。 在文件管 理器中,文件意味规则文件的抽象和数据的 其他来源。 成员方法: public FileObject getFileForInput(JavaFileManager.Location location, String packageName,String relativeName) throws IOException 使用StandardJavaFileManager编译-8 public JavaFileObject getJavaFileForInput( JavaFileManager.Location location,String className, JavaFileObject.Kind kind) throws IOException public FileObject getFileForOutput( JavaFileManager.Location location, String packageName,String relativeName, FileObject sibling)throws IOException 使用StandardJavaFileManager编译-9 public JavaFileObject getJavaFileForOutput( JavaFileManager.Location location,String className, JavaFileObject.Kind kind,FileObject sibling) throws IOException public Iterable list(JavaFileManager.Location location, String packageName, Set kinds, boolean recurse) throws IOException 使用StandardJavaFileManager编译-10 public void flush() throws IOException public void close() throws IOException 其它方法参照API文档。 使用StandardJavaFileManager编译-11 StandardJavaFileManager接口是 JavaFileManager接口的子接口,定义的是基 于java.io.File的标准Java文件管理器。 成员方法: public Iterable getLocation( JavaFileManager.Location location) public void setLocation( JavaFileManager.Location location, Iterable path) throws IOException 使用StandardJavaFileManager编译-12 public Iterable getJavaFileObjects(File. files) public Iterable getJavaFileObjects(String. names) public Iterable getJavaFileObjectsFromFiles(Iterable files) public Iterable getJavaFileObjectsFromStrings( Iterable names) 使用StandardJavaFileManager编译-13 练习:测试文件管理器的 JavaFileManager.Location地址的默认值, 然后进行设置。 练习:分别使用JavaFileManager和 StandardJavaFileManager来获得FileObject 对象和JavaFileObject对象。 使用StandardJavaFileManager编译-14 JavaCompiler.CompilationTask表示编译任 务的接口。编译任务尚未开始。要开始任务 ,需要调用 call 方法,且一个编译任务只能 调用一次call方法。 成员方法: public Boolean call() 练习:使用JavaCompiler.CompilationTask 执行编译任务。 使用StandardJavaFileManager编译-15 我们在前面已经讲过JDK 1.6 的编译器 API 强大之处在于,它可以编译的源文件的 形式并不局限于文本文件。JavaCompiler 类 依靠文件管理服务可以编译多种形式的源文 件。比如直接由内存中的字符串构造的文件 ,或者是从数据库中取出的文件,只要这些 文件实现了特定的接口,这个接口就是 FileObject。成员方法: public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException 使用StandardJavaFileManager编译-16 JavaFileObject接口是FileObject接口的子 接口,用于描述一个Java文件对象。 SimpleJavaFileObject类实现了 JavaFileObject接口,为 JavaFileObject 中的 大多数方法提供简单实现。应子类化此类并 用作 JavaFileObject 实现的基础。子类可以 重写此类任意方法的实现和规范。 构造方法: protected SimpleJavaFileObject(URI uri, JavaFileObject.Kind kind) 使用StandardJavaFileManager编译-17 练习:定义一个MyJavaFileObject类,做 SimpleJavaFileObject类的子类,用于描述一 个Java文件对象。 练习:编译非文本形式的源文件,将内存 中的一段字符内容编译成Java文件。 编译器的诊断信息 - 1 第三个新增加的功能,是监听、收集编译 过程中的诊断信息。诊断信息,通常指错误 、警告或是编译过程中的详尽输出。JDK 1.6 通过 Listener 机制,获取这些信息。 DiagnosticListener接口主要用于接收 来自编译器的诊断信息。 成员方法: public void report(Diagnostic diagnostic) 编译器的诊断信息 - 2 DiagnosticCollector类是DiagnosticListener 的实现类,它提供了将诊断收集到一个列表 中的简单方法。 成员方法: public List getDiagnostics() public void report(Diagnostic diagnostic) 编译器的诊断信息 - 3 Diagnostic.Kind枚举用于描述诊断的种类 ,例如,错误或者警告。成员: public static final Diagnostic.Kind ERROR public static final Diagnostic.Kind WARNING public static final Diagnostic.Kind MANDATORY_WARNING public static final Diagnostic.Kind NOTE public static final Diagnostic.Kind OTHER 编译器的诊断信息 - 4 Diagnostic接口描述一个诊断信息。诊断 通常报告源文件中指定位置处的问题。但是 ,并非所有

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论