Java源文件是如何被找到的?

原写于2010-10-17

 

题记:.java源文件是如何被找到的?.class字节码文件是如何被找到的?内容:全部借鉴《Java深度历险》之package import 機制

 

Package:命名空间的问题,隔离类之间的关系。

Import:声明引入的类的路径(仅在编译时有作用,编译后的文件,类的声明已经为全路径);好处明晰的代码结构,分离在多个文件;帮助实现动态链接的功能

 

一、编译

package edu.nctu;

 

import com.taobao.Test;

import edu.nctu.*;

 

public class C

{

public void print() {

              System.out.println("package test") ;

       }

}

 

步骤:

1. 根据classpath建立,类相对路径参考表

如:javac –cp .;d:/test/,在d:/下执行,结果:d:/d:/test/

2. 类相对路径参考表作为相对起始路径,验证能够找到所有要用的package

根据import引入的package或全限定类名,import packagename.classname,將packagename之中的“.”“/”取代.

       2.1 com.taobao.*形式,验证在d:/目录下是否存在com/taobao/目录,若不存在,依次检查d:/test/

       2.2 com.taobao.Test形式,验证是否存在com/taobao/Test,与上相同。

3. 建立类参考表相对类参考表

       3.1 类参考表:com.taobao.Test

       3.2 类相对参考表:com.taobao.*

4. 解析class{} 包含的代码

是否全限定类名

       4.1 是,绝对路径 =“类相对路径参考表”+全限定类名,查找,不存在为错误;

       4.2 否,绝对路径 =“类相对路径参考表,查找;

              4.2.1是,编译

              4.2.2否,解析package

                     4.2.2.1 在类参考表,是否存在1以上的同名类,出错;否则,绝对路径 =“类相对路径参考表”+ “类参考表,正确。

                     4.2.2.2 在类参考表找不到,绝对路径 = “类相对路径参考表”+ “相对类参考表,若存在一个以上的类,出错;否则,正确。

 

提醒:

1.如果已经存在A .class文件,A .java不是必须的;

2.编译器在找到源码或字节码,会验证是否属于此package,但没有通过make机制的编译,是不会验证的;make机制,即编译器自动维护具有相互依赖关系的文件;javac命令直接编译文件,如:javac -cp d:/test com.edu.C.java,编译器角度:com.edu.C.java 是一个文件名,且没有通过make机制,所以-cp指定的路径建立的类相对路径参考表也不会使用,编译器直接在当前目录下查找com.edu.C.java,结果 ClassNotFoundException

 

二、运行

1. 编译结束后,import指令已经不存在,类被替换为全限定类名

2. 运行时类的加载,都是通过classloader进行,所以必须遵循正确的包目录结构,不管是否直接通过命令行执行。

步骤:

1. 建立字节码路径参考表,根据classpath

2. 绝对路径 = “字节码路径参考表”+ 全限定类名,查找;加载;找不到,报错。

 

附件:<Java深度历险>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值