我现在开始了解Java和OSGi,所以我读了几本书。在一本特定的书中,描述了类加载。
您可以从作者页面(Neil Bartlett)下载(免费和合法): OSGi Book
第9页和第10页是这张照片:
alt text http://img265.imageshack.us/img265/4127/picture1qct.png alt text http://img297.imageshack.us/img297/594/picture2yv.png
似乎我们的班级“Foo”可能不会使用foobar.jar的“Bar”类,而是使用naughty.jar中的“Bar”类。
由于Java类路径的扁平和全局结构,这可能是,但据我所知,您将定义一个包,从中导入某个类:
import foobar.Bar
这应该可以防止加载错误的类,不应该吗?当然假设包被称为“foobar”。
答案 0 :(得分:4)
import
语句与类加载无关 - 它只允许您使用短名称Bar
而不是完全限定的foobar.Bar
。如果foobar.jar
和naughty.jar
都包含具有完全限定名称foobar.Bar
的类,则类加载器将从类路径中具有所需类的第一个jar文件加载类。
答案 1 :(得分:2)
好主意,但不幸的是,包与jar文件名无关。你可以在同一个jar文件中包含任意包中的内容,以及包含不相关包名的任意jar文件名。这取决于类加载器为你解决它们。
答案 2 :(得分:1)
问题是foobar.jar
和naughty.jar
可能有一个类,其完全限定名称为foobar.Bar
。然后foobar.Foo
解析了foobar.Bar
的{{1}}而不是naughty.jar
的{{1}}。
希望这有帮助。
答案 3 :(得分:1)
作者假设这两个版本的Bar
类都在同一个包中(或者没有任何问题)。如果naughty.jar在类路径中是“第一个”,那么作者所描述的内容就会发生。在这种情况下,类加载器会选择顽皮的版本(类加载器以自然顺序扫描类路径并选择找到的第一个类)。
答案 4 :(得分:0)
导入不允许您自由地从所需的Java加载类。您可以从此处了解有关类加载器的更多信息Java Classloaders