)的代码被执行了,因为类加载器在classpath首先看到此版本的代码。
图3. 在类路径中samepath测试排在最前面的version 1
再次运行,类路径做如下微小改动。
set CLASSPATH=.;%CURRENT_ROOT%\v2;%CURRENT_ROOT%\v1%JAVA_HOME%\bin\java Test
控制台的输出变为图4。对应着Version.fx(2)的代码被加载,因为类加载器在classpath中首先找到它的路径。
图4. 在类路径中samepath测试排在最前面的version 2
根据以上例子可以很明显地看出,类加载器加载在类路径中被首先找到的元素。如果我们在v1和v2中删除了version.Version,做一个非version.Version形式的.jar文件,如myextension.jar,把它放到对应java.ext.dirs的路径下,再次执行后看到version.Version不再被AppClassLoader加载,而是被扩展类加载器加载。如图5所示。
图5. AppClassLoader及ExtClassLoader
继续这个例子,文件夹differentversions包含了一个RMI执行引擎,客户端可以提供给执行引擎任何实现了common.TaskIntf接口的任务。