- 类路径,编译器从其中解析库类。编译器类路径通常由一个有序的文件系统目录列表和一些归档文件(JAR 或 ZIP 文件)组成,归档文件中包含先前编译过的 .class 文件。类路径由一个 JavaFileManager 实现,后者管理多个源代码和类 JavaFileObject 实例以及传递给JavaFileManager 构造函数的 ClassLoader。JavaFileObject 是一个 FileObject,专门处理以下任一种由编译器使用的JavaFileObject.Kind 枚举类型:
- SOURCE
- CLASS
- HTML
- OTHER
每个源文件提供一个 openInputStream() 方法,可以作为 InputStream访问源代码。
- javac 选项,以 Iterable<String> 的形式传递
- 源文件 — 待编译的一个或多个 .java 源文件。JavaFileManager 提供了一个抽象的文件系统,可以将源文件和输出文件的文件名映射到JavaFileObject 实例(其中,文件 表示一个惟一名称和一串字节之间的关联。客户机不需要使用实际的文件系统)。在本文的示例中,JavaFileManager 管理类名与 CharSequence 实例之间的映射,后者包含待编译的 Java 源代码。JavaFileManager.Location包含一个文件名和一个标记,该标记可以表明该位置是源代码还是一个输出位置。 ForwardingJavaFileManager 实现 Chain of Responsibility 模式(参见 参考资料),允许将文件管理器链接在一起,就像类路径和源路径将 JAR 和目录链接起来一样。如果在这条链的第一个元素中没有发现 Java 类,那么将对链中的其他元素进行查找。
- 输出目录,编译器在其中编写生成的 .class 文件。作为输出类文件的集合,JavaFileManager 也保存表示编译过的 CLASS 文件的JavaFileObject 实例。
- 编译器。JavaCompiler 创建 JavaCompiler.CompilationTask 对象,后者从 JavaFileManager 中的 JavaFileObject SOURCE对象编译源代码,创建新的输出 JavaFileObject CLASS 文件和 Diagnostic(警告和错误)。静态ToolProvider.getSystemJavaCompiler() 方法返回编译器实例。
- 编译器警告和错误,这些内容通过 Diagnostic 和 DiagnosticListener 实现。Diagnostic 是编译器发出的警告或编译错误。Diagnostic 指定以下内容:
- Kind(ERROR、WARNING、MANDATORY_WARNING、NOTE 或 OTHER)
- 源代码中的位置(包括行号和列号)
- 消息
Read full article from 心如止水: Java 编译:概念和实现
No comments:
Post a Comment