- 浏览: 1683665 次
- 性别:
-
文章分类
- 全部博客 (2929)
- 非技术 (18)
- Eclipse (11)
- JAVA (31)
- 正则表达式 (0)
- J2EE (4)
- DOS命令 (2)
- WEB前端 (52)
- JavaScript (69)
- 数据库 (8)
- 设计模式 (0)
- JFreechart (1)
- 操作系统 (1)
- 互联网 (10)
- EasyMock (1)
- jQuery (5)
- Struts2 (12)
- Spring (24)
- 浏览器 (16)
- OGNL (1)
- WebService (12)
- OSGi (14)
- 软件 (10)
- Tomcat (2)
- Ext (3)
- SiteMesh (2)
- 开源软件 (2)
- Hibernate (2)
- Quartz (6)
- iBatis (2)
最新评论
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 动态代理实现AOP
2009-07-22 14:29 613目前整个开发社区对AOP(Aspect Oriented P ... -
Java中用动态代理类实现记忆功能
2009-07-22 14:30 708记忆是衍生自lisp,python, ... -
JAVA动态代理实现方法
2009-07-22 14:31 699在目前的Java开发包中包含了对动态代理的支持,但是其实现只支 ... -
对代理模式与Java动态代理类的理解(转)
2009-07-22 14:32 7721. 代理模式 代理模式的作用是:为其他对象 ... -
十年与java 相关的名字
2009-07-22 17:12 737RickardOberg:J2EE奇才 文/ ... -
搞懂java中的synchronized关键字
2009-07-28 17:48 615实际上,我关于java的基 ... -
字符串转化为unicode编码
2009-07-31 16:16 910package com.util; import java. ... -
移位运算符的规则及其数学意义
2009-07-31 18:02 790移位运算符就是在二进制的基础上对数字进行平移。按照平移的方 ... -
几个谜题,深入的了解java
2009-08-03 17:02 736在2009年的JavaOne大会上,Joshua Bloch和 ... -
一、我对java中编码的理解(摘)
2009-08-06 09:17 6301. 编码的产生 对电 ... -
四、深入下package,import:(摘)
2009-08-06 09:18 715注:因package,import涉及较多内容,另开一个帖子了 ... -
二、我对java中类装载的理解(摘)
2009-08-06 09:18 7791.Java中的所有类,必须 ... -
java class文件格式解析(摘)
2009-08-06 09:19 7971.目的 ... -
关于 JavaBean 规范你还是应该知道的二三事
2009-08-06 09:22 835作为 Java 程序员,对于 JavaBean 也许你会说再熟 ... -
synchronized(this)的几个简单示例
2009-08-06 10:31 830一、当两个并发线程访问同一个对象object中的这个synch ... -
java压缩对象 与 对象的序列化
2009-08-07 17:39 682gzip是目前广泛应用的一种压缩方式,它具有很高的压缩比和压缩 ... -
Java常见问题集锦
2009-08-12 12:22 686如何设置Java 2(JDK1.2)的环境变量? 哪些Jav ... -
JavaFX尝鲜
2009-08-17 17:24 509java6出来以后,其一大 ... -
Java在不同环境下获取当前路径的方法--this.getClass().getResource("")
2009-08-17 17:24 7161. 在Servlet/Filter等Servlet web环 ... -
JAVA进阶:VO(DTO)与PO(DAO)之间的转换
2009-08-26 13:58 902PO即 Persistence Object VO ...
相关推荐
**知识点**:树的高度是树结构中最长路径上节点的数目减一。本题要求计算一棵树的高度,需要理解树的数据结构和递归算法。 #### 题目十一:逆序数 **知识点**:逆序数是在一个序列中,如果一对元素的顺序与它们在原...
3. **编程语言基础**:信息学奥赛常用的编程语言有C++、Python、Java等,理解变量、控制结构(如循环、分支)、函数、类等基本概念至关重要。 4. **动态规划**:在解决某些优化问题时,动态规划是一种非常有效的...
开发者可以在ActionForm类中重写validate()方法,对用户输入进行验证,如果验证失败,ActionForm会设置错误信息,Action可以根据这些错误信息决定是否需要重新显示表单并提示用户。 在实际开发中,Struts 2替代了...
Android源代码中的某些Activity类之所以庞大,往往是因为它们包含了过多的业务逻辑和数据管理,这在一定程度上反映了Activity间数据共享的局限性。为缓解这个问题,开发者可以考虑以下设计模式: 1. 单例模式:对于...
4. **音乐文件管理**:在编程学习中,可以编写程序来管理和播放这些音频文件,例如使用Python的`pyglet`库或Java的`JLayer`库进行音频操作。此外,了解文件系统和文件路径的概念也至关重要,以便正确访问和播放这些...
标题中的"acmfirst.rar_VC书籍_Visual_C++_"暗示了这是一份与ACM(国际大学生程序设计竞赛)相关的资源,其中包含了使用Visual C++编程语言的书籍或教程资料。描述中提到"acm竞赛赛题 我们的学校的赛题 老师推荐实用...