【问题标题】:I have two classes with same name and same package structure in different jars. Is it possbile to choose a class from jar specifically?我在不同的 jar 中有两个具有相同名称和相同包结构的类。是否可以专门从 jar 中选择一个类?
【发布时间】:2017-10-30 19:45:31
【问题描述】:

如前所述,我在不同的 jar 中有两个具有相同名称和相同包结构的类。 让我们说
jar1 我的班级是 a.b.c.ClassName
jar2 中,我的班级是 a.b.c.ClassName
我有不同的构造函数来区分这些类。

我的问题是,是否可以基于构造函数创建对象。 例如,

if(condition){
a.b.c.ClassName obj = new a.b.c.ClassName(Param);
}
else{
a.b.c.ClassName obj = new a.b.c.ClassName(Param, AnotherParam);
}

谢谢,

【问题讨论】:

  • 多年来我从事过一些项目,这些项目在不同的 jar 中具有相同的类包/名称,但它只造成了麻烦。我认为存在双类是一个错误,即使 java 有它会首先找到的规则,我不知道你的项目的历史,但如果可能的话,我建议解决这个问题。咆哮:)
  • 首先,你是怎么编译这个的?
  • 你有一个重大的设计错误。修复它。

标签: java overloading


【解决方案1】:

我的问题是,是否可以基于构造函数创建对象。

我带你问Java是否会根据哪个版本的类具有与给定签名匹配的构造函数来选择从哪个jar中加载类。不,它不会。 Java 将在类路径中的目录和 jar 中按顺序查找指定的类,并将使用它找到的第一个。

可以想象,您可以编写一个自定义 ClassLoader 来帮助您根据可用构造函数的签名选择要加载的类的哪个版本,但这些功能不会像您想要的那样自动触发。 Java 在考虑其中可用的构造函数之前加载该类。您需要手动加载该类,并且可能需要反思地实例化它。你的问题不会就此结束。几乎可以肯定,所有这些都比它的价值要麻烦得多。

写一个子类而不是同一个类的不同版本怎么样?

【讨论】:

  • 实际上我正在使用hadoop。 hadoop-1.2.1-core.jar 中有一个类 org.apache.hadoop.mapreduce.TaskAttemptContext,hadoop 2 中有类似的 jar。现在我想根据我想使用的 hadoop 版本创建对象。无论如何,感谢您提供可能的解决方案。
  • @user3655191,您使用代码的 context 与答案无关。如果您的意思是您要询问 Java 以外的其他语言的代码,那么您应该使用适当的语言标签而不是 [java] 来标记您的问题。
  • 在同一个类加载器中使用同一个库的两个版本可能最终会出现由同一个“找到第一个类”问题引起的后续问题。使用多个类加载器可能是解决它的唯一实用方法。或坚持一个版本。
  • 是的,@SlipperySeal。当我说“你的问题不会到此为止”时,这就是我所指的部分内容。即使为每个 jar 使用单独的 ClassLoader 仍然可能会出现问题。根据代码需要执行的操作,也许可以完成这项工作,但正如我所说,这几乎可以肯定比它的价值更麻烦。
  • @JohnBollinger 同意。
【解决方案2】:

更改 pom.xml 中的依赖顺序。预先导入你想要的jar。

【讨论】:

  • 这无法根据构造函数选择使用哪一个,
猜你喜欢
  • 2020-03-20
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
  • 2011-10-16
  • 2011-06-27
  • 2018-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多