ant构建工具的类装载器问题

http://tech.ddvip.com   2006年11月20日    社区交流

本文详细介绍ant构建工具的类装载器问题

ant -Darg0=cn.itcast.AuxiliaryClass -Darg1=cnitcast

  命令执行的结果为:

cn.itcast.MainClass
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader

  从第一行打印的内容上可以看到:AuxiliaryClass类的类装载器为MainClass。这个结果与我的预期不同,因为按照类加载器的委托机制,MailClass类加载器将先委托其父级类装载器AppClassLoader加载AuxiliaryClass,而AuxiliaryClass所在的目录f:project已经在第6步中加入到了Classpath环境变量当中,AppClassLoader可以成功加载AuxiliaryClass,所以,第一行打印出来的类装载器应该是AppClassLoader。为了印证我的想法,我改用java.exe来执行上面的程序:

java cn.itcast.MainClass cn.itcast.AuxiliaryClass cnitcast

  执行结果如下:

sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader

  可见,使用java.exe执行上面的程序时,AuxiliaryClass类的类装载器确实是MailClass类加载器的父级类加载器AppClassLoader。这就是我这次问题的内容:为什么在ant环境下运行,MailClass类加载器没有委托其父级类装载器AppClassLoader加载AuxiliaryClass类,而是自己加载了呢?就这个问题,本人向真正的Java高手们请教?请您帮忙解释一下原因。

  8.为了印证类加载器的委托机制,我们重新设置CLASSPATH环境变量,该环境变量不再包含AuxiliaryClass所在的目录f:project。

  set CLASSPATH=f:projectclasses;

  用cd命令进入f:目录(避免当前目录的干扰),接着重复执行如下的java命令:

  java cn.itcast.MainClass cn.itcast.AuxiliaryClass projectcnitcast

  执行结果如下:

cn.itcast.MainClass
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader

  可见,这次AuxiliaryClass类的类装载器是MailClass类,这是因为MailClass类装载器的父级类加载器AppClassLoader找不到AuxiliaryClass类,加载过程又退回到MailClass类装载器,MailClass类装载器从projectcnitcast目录中成功找到AuxiliaryClass类,所以,这次打印出的类装载器为MailClass。

来源:csdn    责编:豆豆技术应用

正在加载评论...