首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

java源文件是怎么被找到的

2013-01-28 
java源文件是如何被找到的?题记:.java源文件是如何被找到的?.class字节码文件是如何被找到的?内容:全部借

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

题记:.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深度历险>

热点排行