试图理解Java类加载

时间:2010-04-13 23:27:08

标签: java classpath

我现在开始了解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”。

5 个答案:

答案 0 :(得分:4)

import语句与类加载无关 - 它只允许您使用短名称Bar而不是完全限定的foobar.Bar。如果foobar.jarnaughty.jar都包含具有完全限定名称foobar.Bar的类,则类加载器将从类路径中具有所需类的第一个jar文件加载类。

答案 1 :(得分:2)

好主意,但不幸的是,包与jar文件名无关。你可以在同一个jar文件中包含任意包中的内容,以及包含不相关包名的任意jar文件名。这取决于类加载器为你解决它们。

答案 2 :(得分:1)

问题是foobar.jarnaughty.jar可能有一个类,其完全限定名称为foobar.Bar。然后foobar.Foo解析了foobar.Bar的{​​{1}}而不是naughty.jar的{​​{1}}。

希望这有帮助。

答案 3 :(得分:1)

作者假设这两个版本的Bar类都在同一个包中(或者没有任何问题)。如果naughty.jar在类路径中是“第一个”,那么作者所描述的内容就会发生。在这种情况下,类加载器会选择顽皮的版本(类加载器以自然顺序扫描类路径并选择找到的第一个类)。

答案 4 :(得分:0)

导入不允许您自由地从所需的Java加载类。您可以从此处了解有关类加载器的更多信息Java Classloaders