`

三、我对java中类路径的理解(摘)

    博客分类:
  • JAVA
 
阅读更多

Java中的类路径分“编译后的存放路径” 和 “运行时的查找路径”,下面分别谈谈

1. java编译后的类存放路径,

分两种:“源文件被直接编译”和“源文件被间接编译”
1-1源文件直接编译
什么是源文件直接编译:即通过javac直接编译源文件
建立d:/my目录,在其目录下新建一个文件,如下:

Public class HelloWorld{
Public static void main(String[] args){
System.out.println(“HelloWorld”);
}
}

在命令行输入: javac HelloWorld.java

这时在d:/my这个目录下就产生了一个类文件HelloWorld.class
在命令行输入: java HelloWorld
HelloWorld

正常输出

改变一:
把原文件中的输出内容改为”changeHelloWorld”
重新编译,运行,可以看到在控制台输出了
changeHelloWorld

改变二:
恢复一的改变,并删除之前生成的类文件, 在源文件中的头部加入
Package com.test;

然后在命令行输入: javac –d . HelloWorld.java
这时在d:/my这个目录下就产生了一个新的目录com/test,类文件HelloWorld.class就位于test下
注,如果不指明路径,则javac只会把生成的类文件放在默认包中,如同没包

改变三:
删除改变二中所产生的目录结构与类
然后在命令行输入: javac –d d:/ HelloWorld.java
这时在d:/ 这个根目录下就产生了一个新的目录com/test,类文件HelloWorld.class就位于test下

总结:对于源文件被直接编译的,其规则如下:
1. 每一次执行javac命令都会重新编译源文件,
2. 编译后的类文件的存放地址可以指定
3. 源文件带package结构的,编译时系统直接产生类文件存放的目录结构(针对package所指定,注意一定要明确指定编译后的路径喔)


1-2源文件间接编译
什么是源文件间接编译:放在A类中的B类,当A.java通过javac编译时,B也会被编译

建立d:/my1目录,在其目录下新建两个文件,如下:
A. java
public class A{
public static void main(String[] args){
B b1 = new B();
b1.print();
}
}

B. java
public class B{
public void print(){
System.out.println("package test");
}
}

接着在命令行输入 javac A.java
这时在d:/my1这个目录下就产生了两个类文件A.class与B.class
执行java A
Package test

改变一:
删除以上所产生的类文件,修改两个文件的源代码,分别在头部加上import edu.nctu.*;和package edu.nctu;即
A. java
import edu.nctu.*;
public class A{
public static void main(String[] args){
B b1 = new B();
b1.print();
}
}

B. java
package edu.nctu;
public class B{
public void print(){
System.out.println("package test");
}
}

在命令行输入:
Javac A.java
接着会出现一些错误提示,主要提示如下:
A. java:1:package edu.nctu does not exist

解决方式:把d:/my1目录下的B.java移到d:/my1/edu/nctu/下就可以了

注意: 如果d:/my1下仍然存在B.java则还会报错,因为编译器总是先到A.java本身所在的路径中寻找B.java,虽然编译器找到了B.java,可是对比其package声明之后,认为它应为位于edu/nctu目录下,不该在此目录,因此产生错误信息

结论,对于间接被编译的.java文件,遵从如下规则
1. 该间接文件没有包的,则被直接编译,生成的类文件存放地址和原文件相同
2. 带包的间接文件,要想正确编译,必须明确手动建立包目录结构并且把间接文件置于其内
3. 。。。

2. 运行时的查找路径

java 是通过 java虚拟机来解释运行的, 也就是通过 java 命令。 javac 编译生成的 .class文件就是虚拟机要执行的代码, 称之为字节码(bytecode), 虚拟机通过 classloader来装载这些字节码, 也就是通常意义上的类. 这里就有一个问题, classloader 从哪里知道 java 本身的类库及用户自己的类在什么地方呢? 或者有着缺省值(当前路径).
实际上 java 虚拟机是由 java luncher 初始化的, 也就是 java (或 java.exe)这个程序来做的. 虚拟机按以下顺序搜索并装载所有需要的类:

1, 系统类: 组成 java 平台的类, 包含 rt.jar等类.

2, 扩展类: 使用 java 扩展机制的类, 都是位于扩展目录($JAVA_HOME/jre/lib/ext)?中的 .jar 档案包.

3, 用户类: 开发者定义的类或者没有使用 java 扩展机制的第三方产品.

以上的类,程序运行时,是如何找到的? 下面做个说明:

当我们在命令行输入java XXX 的时候,java.exe的工作就是找到合适的JRE来执行类文件。Java.exe依照如下逻辑来寻找JRE:

1. 自己的目录下有没有JRE目录

2. 父目录下的JRE子目录

3. 查询windows Registry(HKEY_LOCAL_MACHINE/Software/JavaSoft/Java Runtime Environment/).

根 据以上的逻辑,java找到JRE,进而找到系统类和扩展类(因为它们都位于JRE中,且位置固定?),所以“系统类”和“扩展类”的类查找问题就解决 了,下面再谈谈用户类的查找,用户类路径就是一些包含类文件的目录, .jar, .zip 文件的列表,我们要使用它,必须在命令行中使用 -classpath 选项或者使用 CLASSPATH 环境变量来确定这些类的位置或则按缺省查找,规则如下:

* ".", 指当前目录, 是缺省值.

* CLASSPATH 环境变量, 一旦设置, 将缺省值覆盖

* 命令行参数 -cp 或者 -classpath, 一旦指定, 将上两者覆盖.

* 由 -jar 参数指定的 .jar 档案包, 就把所有其他的值覆盖, 所有的类都来自这个指定的档案包中. 由于生成可执行的 .jar 文件, 还需要其他一些知识, 比如 package等,对于package,import机制,下一个专题再尝试谈谈.

以上错漏之处,请大伙提出,先谢过

摘自:http://topic.csdn.net/u/20090331/11/0D5E721C-0F61-4F60-9C0A-C643F649022D.html

分享到:
评论

相关推荐

    通过java类的路径实例化类并调用方法

    通过java类的路径实例化类并调用方法:仅仅知道类的路径,就可以实例化对象,利用反射机制调用其方法

    java中相对路径与绝对路径的问题

    在效劳器中的 Java 类中,我们可以使用 `WebApplication 的操作系统文档根列表` 来获取当前路径。例如,我们可以使用 `Weblogic 的文档根路径` 来获取当前路径。 了解 Java 中的相对路径和绝对路径是非常重要的,...

    java中File的相对路径与绝对路径总结

    - 需要注意的是,这种方式同样只能获取到类路径中的资源。 #### 注意事项 - **使用相对路径时**,务必确保路径的正确性,否则可能会导致无法找到文件的情况发生。 - **使用绝对路径时**,虽然可以更精确地定位...

    Java中获取文件路径的几种方式

    理解如何在Java中获取文件路径,特别是区分绝对路径和相对路径,对于构建稳定、可移植的应用程序至关重要。本文将深入探讨Java中获取文件路径的多种方法,以及这些方法背后的原理。 ### 一、Java中的路径类型 ####...

    java 最短路径 问题 动态规划

    根据给定的信息,本文将详细解释Java实现的最短路径问题动态规划算法。...这种方法不仅能够找到从起点到各个节点的最短路径,还能提供到达这些最短路径时的决策路径,对于理解和应用最短路径问题具有很好的参考价值。

    用java通过文件操作实现最短路径问题

    在Java中,可以使用二维数组来存储每个节点对的最短路径信息。 在实现过程中,文件操作部分包括以下步骤: 1. **读取输入文件**:使用`BufferedReader`或`Scanner`类读取文件内容。文件可能包含图的节点信息和边的...

    JAVA_API1.6文档(中文)

    java.security.cert 提供用于解析和管理证书、证书撤消列表 (CRL) 和证书路径的类和接口。 java.security.interfaces 提供的接口用于生成 RSA Laboratory Technical Note PKCS#1 中定义的 RSA(Rivest、Shamir 和 ...

    Java版查找并打印有向图中的所有环路径

    在给定的文件中,可能包含`Graph.java`、`MSTApp.java`和`Vertex.java`三个类。`Graph.java`通常用于实现有向图的逻辑,包括添加顶点、添加边以及查找环路的算法;`Vertex.java`可能定义了顶点类,包含顶点的属性和...

    Java的学习路径

    深入学习后,你需要理解类和对象,这是Java的核心概念。了解封装、继承和多态,这是面向对象编程的三大特性。同时,学习如何创建和使用类,理解类的构造函数、访问修饰符以及对象的生命周期。 接着,你需要掌握异常...

    Java 编写的AOE网络求关键路径

    理解并掌握如何在Java中实现这一算法对于软件开发人员来说至关重要,特别是那些参与项目管理或系统分析的人员。 首先,我们需要了解AOE网络的基本概念。在网络中,每个节点表示一个活动,每条边表示活动之间的依赖...

    java 无向图所有最短路径算法的实现

    项目中的`题目.txt`可能是对这些问题的具体描述或测试用例,而`ProjectForth`可能包含了上述算法的Java实现代码。通过阅读和理解这些代码,你可以学习如何在实际项目中应用这些算法,以及如何在Java环境下进行图的...

    Java学习路径三篇.exe

    Java学习路径三篇.exeJava学习路径三篇.exeJava学习路径三篇.exeJava学习路径三篇.exeJava学习路径三篇.exeJava学习路径三篇.exeJava学习路径三篇.exeJava学习路径三篇.exeJava学习路径三篇.exeJava学习路径三篇.exe

    Java网络编程第三版.pdf

    10. **最新技术**:第三版可能会涵盖Java的新特性和更新,例如Java 8及更高版本中的新功能,以及对Java网络编程的影响。 总之,《Java网络编程第三版》是一本全面介绍Java网络编程的书籍,无论你是初学者还是有经验...

    java+OpenCV 图片对比、标记差异部分(可以支持中文路径)

    由于提到可以支持中文路径,这意味着在处理文件路径时,已经考虑到了中文字符的编码问题,这通常涉及到Java中的`URLEncoder`或`Charset`类来正确地处理文件名。 图片对比的基本思路是将两张图片转换为像素数组,...

    java 中文字转为英文

    java 中文字转为英文java 中文字转为英文java 中文字转为英文

    java下载可选择保存路径

    java生成excel并下载到本地(可选择保存路径),文件通过流的形式响应客户端浏览器下载到本地。

    Java路径问题最终解决方案.doc

    在Java中,可以使用ClassLoader的`getResource()`和`getResourceAsStream()`方法,以相对路径的方式查找类路径下的资源。 四、相对于当前用户目录的相对路径 例如:相对于System.getProperty("user.dir")返回的路径...

    Java 读取类路径下的资源文件实现代码

    在Java中,类路径包括了编译后的class文件、资源文件等目录或jar包。Java提供了多种方法来访问类路径下的资源,其中使用最多的是ClassLoader的getResource和getResourceAsStream方法。 在提供的文件中,通过一个名...

    Java:寻找两点之间所有路径

    标题“Java:寻找两点之间所有路径”涉及到的是在图论中的一个经典问题,即如何在图(可以是无向图或有向图)中找出从一个起点到终点的所有可能路径。这个问题在许多实际场景中都有应用,比如网络路由、社交网络分析...

    java路径详解

    在Java中,路径的解析和使用对于程序的正常运行至关重要,尤其是在处理类路径(ClassPath)资源时。以下是一些关键知识点: 1. **路径类型**: - 绝对路径:从根目录开始的完整路径。 - 相对路径:相对于当前工作...

Global site tag (gtag.js) - Google Analytics