2010-09-25 160 views
3

我有一种情况,我必须加载一个命名的类。如果在我的类路径中有多个具有相同名称的类(例如,com.example.myclass),我必须同时加载这两个类。我正在使用派生自java.lang.ClassLoader的CustomLoader类的'loadClass()'方法。我没有改变父类的行为,只是简单地调用父类的方法。我的问题是,如果有两个同名的类,我只能加载其中的一个。我已扫描网络寻找解决方案,但没有找到任何解决方案。我通过创建一个新的类加载器实例发现了许多重载类的解决方案,但在我的情况下,新实例可能会再次加载第一个类。这个问题能解决吗?解决java中的类名冲突

编辑:我忘了提及这两个类具有相同名称在不同的jar文件。

编辑:无论乔恩和斯蒂芬作出了同样的解决方案,但我只能标记一个作为答案。对不起:(我已经投了两个答案,但。

回答

6

相信 JVM和类库假设一个类名是一个类加载器中是唯一的。因此,如果你想为不同类加载相同的类名,你需要不同的类加载器(例如,一个用于每个jar文件)。

使用它们可能会非常棘手,但这是排序的问题,你有这样的事情搞定了。

+0

我是Java新手。你能解释一下每个jar的classloader是什么意思吗?我如何为每个jar指定一个不同的类加载器? – 341008 2010-09-25 06:34:30

+1

@Rajorshi:您将不得不创建一个指出每个jar文件的(比如说)URLClassLoader的新实例,并要求每个实例加载该类。但说实话,如果你是Java新手,我会开始尝试这种事情一段时间。我甚至建议有经验的Java开发人员应尽可能避免陷入这种情况。 – 2010-09-25 07:13:03

+0

感谢您的提示。我不能拒绝实现这个模块,但高级java开发人员将会检查代码。如果我错过任何东西,他们应该能够发现它。 – 341008 2010-09-25 07:43:49

4

类装入器API也没办法指定

这两个类具有相同的名称,你的应用程序试图加载的。

您将需要使用不同的类路径配置两个不同的类加载器。然后,您将需要通过在相应的类加载器上调用loadClass(String)方法来加载类。

有许多“陷阱”有做这种事情的。其中之一是各个类的实例类型将会不同,并且从一个类型到另一个类型的类型转换将失败。

+0

不幸的是,在运行时不能配置类路径。 – 341008 2010-09-25 06:37:28

+3

@Rajorshi - 哦,是的,它是!请参阅http://download.oracle.com/javase/6/docs/api/java/net/URLClassLoader.html – 2010-09-25 06:39:13

0

我认为有一些严重错误问题这里。这种状况怎么可能首先出现?首先会产生重复类的开发过程存在严重问题。

或者是问题,这是试图解决?还是诊断?

+0

这是一个插件框架,期望所有第三方都存在于特定的文件夹中。插件可以由任何人编写,所以我们不能保证不会有任何冲突。 – 341008 2010-09-27 16:31:55

+1

然后,我建议你制定一条规则,使其包名中使用com.mycompany.whatever作为推荐用于所有Java编程的规则,并且如果他们没有遵守它,则不承担责任。 – EJP 2010-09-28 07:54:30