请教,有关类加载的问题?

03-10-27 yang_jh
//A.java

public class A{

public static void main(String[] args){

A a=new A();

System.out.println(System.getProperty("java.ext.dirs"));

System.out.println(a.getClass().getClassLoader());

B b=new B();

b.print();

}

}

//B.java

public class B{

public void print(){

System.out.println(this.getClass().getClassLoader());

}

}

以上是两个测试类加载的文件,在dos下我对两个类都进行了变译并在某目录下生成了类文件(如:D:\txd),dos下我进入此目录,然后执行指令――java A.显示信息如我所愿,都是由AppClassLoader来加载的,但是依照委托模式(AppClassLoader的父应该是ExtClassLoader)的原理,我将B放入%java_home%\jre\lib\ext(或者%java_home%\jre\lib\ext\classes)目录下,我依然在txd目录下执行指令java A,结果无法找到类B(我不知道为什么?),总之,我现在已经作了很多的测试我就是无法让ExtClassLoader来加载我的类。另:我在classpath下已进行了设置。我非常希望能得到帮助。谢谢

yang_jh
2003-10-27 09:20
这是我整理的有关在J2SE环境下的类加载,现在测试没有如我所愿,是不是我在委托模型那块理解有误,请指教!

加d:指的是⒁延械念名O置成字aK⑵滢DQ成Java例的^程

先fJVM\行ra生三加d器(ClassLoader):

Bootstrap ClassLoader (super),Extension ClassLoader(parent)和AppClassLoader(son)

1. Bootstrap ClassLoader是使用C++的,在Java中看不到它.它是用砑虞dJava核心的.也就是f,只要JVM跑起恚屈N在%JAVA_HOME%/jre/lib中的jarn都自颖患虞d了.此加d器是由JVMF的

2. Extension ClassLoader是用砑虞d扩展类,即%JAVA_HOME%/jre/lib/ext中的类。

3. AppClassLoader是用砑釉Classpath中的的

ClassLoader加d用的是委模型.

委模型(在ClassLoader中的解):

A如果是由某ClassLoader砑虞d的,假O在A中引用到了B.那N此rB就A的ClassLoader砑虞d自己,而此rA的ClassLoader又任兴母ClassLoader砑虞dB,如果找不到B,那N再由自己碚遥绻僬也坏筋B,就由B自己砑虞d自己.@就是委模型.

iceant
2003-10-27 10:58
首先你要弄清楚你的 EXT 目录是指向哪的,A 运行的时候已经把那个目录列出来了。

其次,请确认你使用的是 JDK1.2 以后版本的 JDK, 因为这种 ClassLoader 模型是从 jdk1.2 以后才有的.

然后,如果你使用 JDK1.4 以上版本的 JDK, 请把你设置的 CLASSPATH 置空: set CLASSPATH=

其它版本的 JDK 请这样设置 CLASSPATH: set CLASSPATH=.;%JAVA_HOME%\lib\tools.jar;

yang_jh
2003-10-27 11:11
非常感谢你,我现在已经成功了,只是我有一点不明白,为什么1.4以上版本要将CLASSPATH置空呢?

yang_jh
2003-10-27 11:44
再麻烦一下,我现在jdk有两个目录,如下:

C:\j2sdk1.4.1_02和C:\Program Files\Java\j2re1.4.1_02

我现在的JAVA_HOME为C:\j2sdk1.4.1_02,而且我的classpath的设置都是与C:\j2sdk1.4.1_02相关的,C:\Program Files\Java\j2re1.4.1_02我对这个目录感到很奇怪。为什么我在dos下运行程序会找到它,上面那个A跑的时候,语句System.out.println(System.getProperty("java.ext.dirs"));显示出的信息是 C:\Program Files\Java\j2re1.4.1_02\lib\ext。而不去找C:\j2sdk1.4.1_02目录下的环境。我想起我上次安装eclipse的时候,找到的default环境也是它。为什么,我感到莫名。请指教,谢谢

猜你喜欢
2Go 1 2 下一页