java下第八章编译器API.ppt

上传人:sccc 文档编号:5599228 上传时间:2023-07-31 格式:PPT 页数:33 大小:460.01KB
返回 下载 相关 举报
java下第八章编译器API.ppt_第1页
第1页 / 共33页
java下第八章编译器API.ppt_第2页
第2页 / 共33页
java下第八章编译器API.ppt_第3页
第3页 / 共33页
java下第八章编译器API.ppt_第4页
第4页 / 共33页
java下第八章编译器API.ppt_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《java下第八章编译器API.ppt》由会员分享,可在线阅读,更多相关《java下第八章编译器API.ppt(33页珍藏版)》请在三一办公上搜索。

1、,第八章,编译器API,学习目标,编译器概述,了解API能够实现的功能。能够熟练使用ToolProvider获得系统默认编译器,并动态完成编译操作。熟练应用StandardJavaFileManager管理相关的输入和输出,以及编译非文本文件。能够运用DiagnosticListener监听、收集编译过程中的诊断信息。,范例导入,程序代码的自我复制和自我修改是一种非常强大的能力,但这种能力常被滥用来制造病毒,以至于现代操作系统通常不允许修改程序的代码段和禁用调用栈的执行权限来保证代码的安全性。这使得通过修改自身代码来实现某种逻辑的合理编程方法受到了限制。而JDK 1.6赋予了程序员在运行时刻产

2、生并编译Java源代码的能力,这和Java的反射机制结合在一起,使得Java程序可以在运行过程中产生新类,替换旧类,动态修改自身组件以进行自适应优化运行时刻的性能。,编译器API概述-1,JDK 1.6 提供了在运行时调用编译器的 API,后面我们将假设把此 API 应用在 JSP 技术中。在传统的 JSP 技术中,服务器处理 JSP 通常需要进行下面六个步骤:、分析 JSP 代码、生成 Java 代码、将 Java 代码写入存储器、启动另外一个进程并运行编译器编译 Java 代码、将类文件写入存储器、服务器读入类文件并运行;但如果采用运行时编译,可以同时简化步骤 4 和 5,节约新进程的开销

3、和写入存储器的输出开销,提高系统效率。,编译器API概述-2,新 API 的第二个新特性是可以编译抽象文件,理论上是任何形式的对象,只要该对象实现了特定的接口。第三个新特性是可以收集编译时的诊断信息。由此可见编译器API产生主要是面向热部署或者增量编译这样的场合,目的是增强Java和JVM的交互性。,ToolProvider类,ToolProvider类为找出Tool提供了方法,例如,编译器的提供者。成员方法:public static JavaCompiler getSystemJavaCompiler()public static ClassLoader getSystemToolClas

4、sLoader(),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(Str

5、ing args)System.out.println(Hello World!);System.out.println(你好,世界!);,使用StandardJavaFileManager编译-1,JDK 1.6 的编译器 API 强大之处在于,它可以编译的源文件的形式并不局限于文本文件。JavaCompiler 类依靠文件管理服务可以编译多种形式的源文件。比如直接由内存中的字符串构造的文件,或者是从数据库中取出的文件。如果要使用 JavaFileManager,就必须构造 CompilationTask。JDK 1.6 提供了 JavaCompiler.CompilationTask 类来

6、封装一个编译操作。这个类可以通过JavaCompiler的getTask方法得到。,使用StandardJavaFileManager编译-2,JavaCompiler接口代表Java的编译器,方法如下:public StandardJavaFileManager getStandardFileManager(DiagnosticListener diagnosticListener,Locale locale,Charset charset),使用StandardJavaFileManager编译-3,public JavaCompiler.CompilationTask getTask(W

7、riter out,JavaFileManager fileManager,DiagnosticListener diagnosticListener,Iterable options,Iterable classes,Iterable compilationUnits),使用StandardJavaFileManager编译-4,JavaFileManager.Location描述文件对象地址,用于由文件管理器确定安置或搜寻文件对象。方法如下:public String getName()public boolean isOutputLocation(),使用StandardJavaFile

8、Manager编译-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_CL

9、ASS_PATH public static final StandardLocation SOURCE_OUTPUT public static final StandardLocation SOURCE_PATH,使用StandardJavaFileManager编译-7,JavaFileManager是文件管理器,这个类可以很好地控制输入、输出。它为运行在JVM编程语言来源和类文件的工具。在文件管理器中,文件意味规则文件的抽象和数据的其他来源。成员方法:public FileObject getFileForInput(JavaFileManager.Location location,

10、String packageName,String relativeName)throws IOException,使用StandardJavaFileManager编译-8,public JavaFileObject getJavaFileForInput(JavaFileManager.Location location,String className,JavaFileObject.Kind kind)throws IOExceptionpublic FileObject getFileForOutput(JavaFileManager.Location location,String

11、packageName,String relativeName,FileObject sibling)throws IOException,使用StandardJavaFileManager编译-9,public JavaFileObject getJavaFileForOutput(JavaFileManager.Location location,String className,JavaFileObject.Kind kind,FileObject sibling)throws IOExceptionpublic Iterable list(JavaFileManager.Locatio

12、n location,String packageName,Set kinds,boolean recurse)throws IOException,使用StandardJavaFileManager编译-10,public void flush()throws IOExceptionpublic void close()throws IOException 其它方法参照API文档。,使用StandardJavaFileManager编译-11,StandardJavaFileManager接口是JavaFileManager接口的子接口,定义的是基于java.io.File的标准Java文件

13、管理器。成员方法: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 Iterab

14、le getJavaFileObjectsFromFiles(Iterable files)public Iterable getJavaFileObjectsFromStrings(Iterable names),使用StandardJavaFileManager编译-13,练习:测试文件管理器的JavaFileManager.Location地址的默认值,然后进行设置。练习:分别使用JavaFileManager和StandardJavaFileManager来获得FileObject对象和JavaFileObject对象。,使用StandardJavaFileManager编译-14,J

15、avaCompiler.CompilationTask表示编译任务的接口。编译任务尚未开始。要开始任务,需要调用 call 方法,且一个编译任务只能调用一次call方法。成员方法:public Boolean call()练习:使用JavaCompiler.CompilationTask执行编译任务。,使用StandardJavaFileManager编译-15,我们在前面已经讲过JDK 1.6 的编译器 API 强大之处在于,它可以编译的源文件的形式并不局限于文本文件。JavaCompiler 类依靠文件管理服务可以编译多种形式的源文件。比如直接由内存中的字符串构造的文件,或者是从数据库中取

16、出的文件,只要这些文件实现了特定的接口,这个接口就是FileObject。成员方法:public CharSequence getCharContent(boolean ignoreEncodingErrors)throws IOException,使用StandardJavaFileManager编译-16,JavaFileObject接口是FileObject接口的子接口,用于描述一个Java文件对象。SimpleJavaFileObject类实现了JavaFileObject接口,为 JavaFileObject 中的大多数方法提供简单实现。应子类化此类并用作 JavaFileObjec

17、t 实现的基础。子类可以重写此类任意方法的实现和规范。构造方法:protected SimpleJavaFileObject(URI uri,JavaFileObject.Kind kind),使用StandardJavaFileManager编译-17,练习:定义一个MyJavaFileObject类,做SimpleJavaFileObject类的子类,用于描述一个Java文件对象。练习:编译非文本形式的源文件,将内存中的一段字符内容编译成Java文件。,编译器的诊断信息-1,第三个新增加的功能,是监听、收集编译过程中的诊断信息。诊断信息,通常指错误、警告或是编译过程中的详尽输出。JDK 1

18、.6 通过 Listener 机制,获取这些信息。DiagnosticListener接口主要用于接收来自编译器的诊断信息。成员方法:public void report(Diagnostic diagnostic),编译器的诊断信息-2,DiagnosticCollector类是DiagnosticListener的实现类,它提供了将诊断收集到一个列表中的简单方法。成员方法:public List getDiagnostics()public void report(Diagnostic diagnostic),编译器的诊断信息-3,Diagnostic.Kind枚举用于描述诊断的种类,例如

19、,错误或者警告。成员:public static final Diagnostic.Kind ERRORpublic static final Diagnostic.Kind WARNINGpublic static final Diagnostic.Kind MANDATORY_WARNINGpublic static final Diagnostic.Kind NOTEpublic static final Diagnostic.Kind OTHER,编译器的诊断信息-4,Diagnostic接口描述一个诊断信息。诊断通常报告源文件中指定位置处的问题。但是,并非所有的诊断都与位置或文件关联

20、。位置是指距离文件开始位置的字符偏移量(从 0 开始)。负值(除 NOPOS 以外)不是有效位置。行号和列号从 1 开始。负值(除 NOPOS 以外)和 0 不是有效的行号或列号。成员:public static final long NOPOS,编译器的诊断信息-5,成员方法:public Diagnostic.Kind getKind()public S getSource()public long getLineNumber()public long getColumnNumber()public String getCode()public long getPosition()publ

21、ic String getMessage(Locale locale),编译器的诊断信息-6,练习:编写一个有错误java源文件ErrorSource.java,然后写一段代码完成对ErrorSource.java文件进行动态编译,并诊断出所有的出错信息。,小结,JDK 1.6 的编译器新特性,使得开发者可以更自如的控制编译的过程,这给了工具开发者更加灵活的自由度。通过 API 的调用完成编译操作的特性,使得开发者可以更方便、高效地将编译变为软件系统运行时的服务。而编译更广泛形式的源代码,则为整合更多的数据源及功能提供了强大的支持。相信随着 JDK 的不断完善,更多的工具将具有 API 支持,我们拭目以待。,谢 谢!,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号