当使用javac编译源文件时,如何查找import导入的类

当编写一个java源代码文件时,此文件通常被称为编译单元(有时也被称为转移单元)。每个编译单元都必须有一个后缀名.java,而在编译单元内则可以有一个public类,该类的名称必须与文件名称一致。每个编译单元只能有一个public类,否则编译器就不会接收。如果在该编译单元之中还有额外的类,那么在包之外无法看见这些类,这是因为它们不是public类,而且它们主要用来为主public类提供支持。

java解释器的运行过程:

  1. 找出环境变量CLASSPATHCLASSPATH包含一个或多个目录,用作查找.class文件的根目录
  2. 从根目录开始,解析器获取包的名称并将每个句点替换成反斜杠,以从CLASSPATH根中产生一个路径名称。以cn.example.simple为例,它会转换成cnexamplesimple
  3. 得到的路径会与CLASSPATH中的各个不同的项相连接,解析器就在这些目录中查找与你所要创建的类名称相关的.class文件

例子:

使用包名:cn.example.simple在该名称空间下,新建两个类:

package cn.example.simple;

public class Vector{
    public Vector(){
        System.out.println("cn.example.simple.Vector");
    }
}
package cn.example.simple;

public class List{
    public List(){
        System.out.println("cn.example.simple.List");
    }
}

将这两个文件置于目录:C:DOCJavaT中,设置CLASSPATH,如下:

  CLASSPATH=.;C:DOCJavaT

 一旦类路径确立,测试文件就可以放在任何目录下:

import cn.example.simple.*;

public class LibTest{
    public static void main(String[] args){
        Vector v = new Vector();
        List l = new List();
    }
}/*output:
cn.example.simple.Vector
cn.example.simple.List
*/

分析:

  当编译器碰到simple类库的import语句时,就开始在CLASSPATH所指的目录中查找,查找子目录cnexamplesimple,然后从已编译的文件中找出名称相符.class文件。

注意:

无论何时创建包,都已经在给定的包名称的时候隐含地指定了目录结构。这个包必须位于其名称所指定的目录之中,而该目录必须是以CLASSPATH开始的目录中可以查询到。

编译过的代码通常放置与源代码的不同目录中,但是必须保证JVM使用CLASSPATH可以找到该路径。

 

 

原文地址:https://www.cnblogs.com/aristole/p/8005910.html