【问题标题】:resolving class name clashes in java解决java中的类名冲突
【发布时间】:2011-04-17 02:30:07
【问题描述】:

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

编辑:我忘了提到同名的两个类在不同的 jar 文件中。

编辑:乔恩和斯蒂芬都给出了相同的解决方案,但我只能将一个标记为答案。抱歉:(。不过我对这两个答案都投了赞成票。

【问题讨论】:

    标签: java class classloader conflict


    【解决方案1】:

    我认为这里的问题存在严重问题。当初怎么可能会出现这样的状况呢?一开始就可能产生重复类的开发过程存在严重问题。

    或者这就是它试图解决的问题?还是诊断?

    【讨论】:

    • 这是一个插件框架,期望所有第三方都存在于特定文件夹中。插件可以由任何人编写,因此我们不能保证不会发生冲突。
    • 那么我建议你制定一个规则,按照所有 Java 编程的建议,他们在包名中使用 com.mycompany.whatever,如果他们不遵守,则不承担任何责任。
    【解决方案2】:

    类加载器 API 无法指定您的应用程序尝试加载的两个同名类中的哪一个。

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

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

    【讨论】:

    【解决方案3】:

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

    使用它们可能会很棘手,但这就是你使用这类东西时遇到的问题。

    【讨论】:

    • 我是 Java 新手。您能解释一下每个 jar 一个类加载器是什么意思吗?如何为每个 jar 指定不同的类加载器?
    • @Rajorshi:您必须创建一个新的(比如说)URLClassLoader 实例,引用每个 jar 文件,并要求每个实例加载该类。但老实说,如果你是 Java 新手,我会开始尝试这种事情一段时间。我什至建议有经验的 Java 开发人员尽可能避免陷入这种情况。
    • 感谢您的提示。我真的不能拒绝实现这个模块,但高级 Java 开发人员将审查代码。如果我错过了任何东西,他们应该能够检测到它。
    • @Rajorshi:好的。这真的取决于你之后需要对这些类做什么,但如果你正在做任何特别复杂的事情,这可能会变得一团糟。
    猜你喜欢
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    相关资源
    最近更新 更多