第二章-文件加载与输出

本文详细介绍了Java编译过程中涉及的文件读写管理,包括对.java和.class文件的操作,以及如何处理依赖的class文件。文章深入探讨了Javac中文件对象的继承体系,解释了JavaFileObject接口的作用,以及不同搜索路径(如CLASS_PATH和SOURCE_PATH)在编译过程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

如对源文件的加载,对jar中依赖的class文件进行加载,并且需要将最终生成的class文件进行写出。这就需要一个统一的文件模块来处理,其中涉及到的主要类如下:

1、Paths、Path

2、ZipArchive

3、BaseFileObject

4、JavacFileManager

(1)实例对象的获取

(2)常用API

 

 

1、概述

编译一个Java源代码涉及到对各种类型文件读取与写入,最一般的就是对.java文件与.class文件的读取了。另外在编译Java源文件时,一般涉及到的依赖都是以.class格式的文件存在的,并且这些文件一般是放到包中。Java类库大多以压缩包形式存储,如*.jar,实际上,lib目录下的ct.sym也是压缩包,javac在编译类时,如果要使用JDK中rt.jar提供的一些类库API,那么会使用ct.sym。这样做是避免当java开发人员调整这些接口时造成客户端代码无法运行。 

 

Java中处理最多的就是.class与.java结尾的文件,这些文件都以对象来表示并且需要专门进行管理,其文件对象的继承体系如下:

如图所示,Javac中每个与文件相关的实现类都直接或间接实现了JavaFileObject接口,这个接口专门为操作.java文件及.class文件而定义的。

每个RegularFileObject类对象可以代表一个Java源文件,多个源文件会封装为List<JavaFileObject>集合进行编译,如果这些源文件中有对其它类的依赖,如: 

package compile;

import java.util.List;

public class Test{
	List<String> l = null;
}

可以看到有对java.util包下的List类的依赖,那么就会通过一定的规则搜索这个依赖类,具体搜索的路径通过StandardLocation进行指定,代码如下:

public enum StandardLocation implements Location {
    /**
     * Location to search for user class files.
     */
    CLASS_PATH,

    /**
     * Location to search for existing source files.
     */
    SOURCE_PATH,

    /**
     * Location to search for annotation processors.
     */
    ANNOTATION_PROCESSOR_PATH,

    /**
     * Location to search for platform classes.  Sometimes called
     * the boot class path.
     */
    PLATFORM_CLASS_PATH;
    // ... 省略了其它一些属性及方法
}

对.java及.class文件的搜索路径进行了归类,主要是4大类:

(1)PLATFORM_CLASS_PATH

(2)SOURCE_PATH

(3)CLASS_PATH

(4)ANNOTATION_PROCESSOR_PATH

 

优先在此类别的路径下搜索.class类型的文件,将会搜索到<java_home>/lib和<java_home>/ext包下的jar文件。 

这两个路径只有在指定了-classpath或者-sourcepath时才会有用。

1、当 -sourcepath 没有指定时,在 -classpath 路径里面搜索 .class 和 .java 文件

2、当 -sourcepath 指定时,只搜索 -classpath 路径下的 .class 文件,即使-classpath 路径下有要找的.java文件也会不搜索这个文件

3、 -sourcepath 只搜索 .java 文件,不搜索 .class 文件。因此应该避免用 -sourcepath,而只用 -classpath 来指定搜索 .class 和 .java 文件的路径

 

  

 

而之前提到的ct.sym压缩包在Javac中表示一个ZipFileIndexFileObject类对象。

 

 

 

 

 

 

 

(2)依赖路径查找 主要是平台路径,如Platform_class_path,class_path、source_path与annotation_processor_path。Paths类解读


(3)加载及处理依赖包


(4)使用依赖相关类

JavacFileManager
RelativeDirectory
Relativefile

(5)优化

 

转载于:https://www.cnblogs.com/extjs4/p/9692380.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值