不同之处在于,loadClass()试图保证被装载的类型是被装载到用户自定义的类装载器的命名空 间里,而forName()试图确认所需的类型被装载到当前命名空间中,这个当前命名空间就是类 型(该类型的方法包括forName ()调用)所属的定义类装载器的命名空间。
因为forName ()从类EasyGrect的main ()方法中被调用,forName ()请求装载所需类型 的类装载器就是EasyGreet的定义类装载器。当在Sun的Java2 SDK1.2版本下运行的时候,装载 EasyGreet的就是系统类装载器,它会在类路径中寻找类。要使用类路径环境变量,可以通过一 个如下的命令行执行随书光盘中linking/ex7目录下的EasyGreet程序:
java EasyGreet Hello
如果没有明确地在命令行或者环境变量中指定一个类路径,系统类装载器会在当前目录中 寻找所需的类型。因为当前目录(随书光盘的linking/ex7目录)中没有包含Hello.dass,系统类 装载器无法找到Hello.class。forName ()方法抛出ClassNotFoundException异常并中止,随后, EasyGreet的main ()方法也同样抛出该异常并中止:
为了能让EasyGreet找到Hello.class,只需要在类路径中包含greeters目录,这可以通过在命 令行使用“-cp”选项指定,如下所示:
java -cp .;greeters;EasyGreet Hello
使用Greet中GreeterClassLoader的loadClass ()方法与EasyGreet中使用forName ()方法的 最重要的区别就是,被装载的greeter类所被装载入的命名空间不同。在Greet里,greeter类被装 载到GreeterClassLoader的命名空间;在EasyGreet里面,greeter类被装载到系统类装载器的命名空间。