Java编译API浅谈
Posted 游戈特
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java编译API浅谈相关的知识,希望对你有一定的参考价值。
Java编译API允许在运行过程中编译所需的源程序,再加载该源程序的类文件。通常,源程序被存储在计算机的磁盘中,Java编译API允许程序在运行过程中编译来自磁盘的文件,编译后再将生成的字节码文件存储在计算机磁盘中。在这种便捷的编译机制中,程序只需要使用JavaCompiler实例的run方法便可编译传给该方法的参数中表示源程序的文件。调用方法得到的返回值为0表示编译成功,否则表示编译失败。
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int result = compiler.run(inputStream, outputStream, errOutputStream, "Example.java");
但是,有时候程序可能希望编译存储在磁盘外的某个地方的源程序,或者程序并不希望将编译后得到的字节码文件存储到磁盘中。为了满足以上开发需求,Java编译API提供了另一种机制,该机制使用JavaFileManager类的实例控制源程序的来源位置和类文件的存储目的地,而由JavaFileObject表示源程序的特定来源和字节码文件的最终去向。对于编译过程中可能遇到的错误信息,则使用实现了DiagnosticListener接口的类的实例收集这些错误信息,通常使用DiagnosticCollector类的实例,该类实现了DiagnosticListener接口。在这种编译机制中,需要使用上述对象调用JavaCompiler的实例方法getTask获取一个JavaCompiler.CompilationTask实例,以上对象正是用以构建这个编译控制工具。最终由CompilationTask实例调用call方法以实现对特定来源处的源代码进行编译,并将产生的字节码文件存储到特定目的地。
JavaCompiler.CompilationTask task = compiler.getTask(writer, fileManager, diagnosticCollector, options, annotationProcessor, fileObject);
boolean compiled = task.call();
对call方法的调用结果为true表示编译成功,同时类文件被存储至指定目的地。在使用该编译机制时,需要创建实现了SimpleJavaFileObject类的子类分别表示源程序的来源和字节码文件的去向。在表示源程序的来源的类中需要复写getCharContent方法。
Java编译API的实现原理仍然是在需要某个类文件时动态的编译对应的源程序,从而获得相应的类文件。便捷之处在于它运行编译非本地计算机存储的源程序代码,也支持将编译得到的字节码文件定向到本地计算机以外。在支持这些理想化需求的同时也保留了传统的编译机制,即对存储在本地计算机的源程序代码编译,再将字节码文件也存储在本地计算机。
以上是关于Java编译API浅谈的主要内容,如果未能解决你的问题,请参考以下文章