2017-02-10 87 views
0

正如我所提到的,我在不同的罐子里有两个具有相同名称和相同包装结构的类。 可以说
jar1我的课是a.b.c.ClassName
jar2我的课是a.b.c.ClassName
我有不同的类构造函数来区分。我在不同的罐子里有两个具有相同名称和相同包装结构的类。专门从jar中选择一个类是否可行?

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

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); 
} 

感谢,

+1

多年来,我一直在做几个项目,这些项目在不同的罐子里有着相同的类包/名称,并且它只造成了麻烦。我认为这是一个存在双重类的错误,尽管java有它的先决条件,但我不知道项目的历史,但我建议尽可能解决这个问题。咆哮:) – slipperyseal

+0

首先,你是如何编译这个的? – hunter

+1

您有一个主要的设计错误。修理它。 – EJP

回答

2

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

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

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

如何写一个子类而不是相同类的不同版本?

+0

其实我正在与hadoop合作。 hadoop-1.2.1-core.jar中有一个类org.apache.hadoop.mapreduce.TaskAttemptContext和hadoop 2中的类似jar。 现在我想创建基于我想要使用的hadoop版本的对象。 无论如何感谢您的可能解决方案。 – Ran

+0

@ user3655191,您使用代码的* context *与答案无关。如果你的意思是你问的是某种非Java语言的代码,那么你应该用适当的语言标签而不是用[java]来标记你的问题。 –

+0

在同一个类加载器中使用同一个库的两个版本可能最终导致后续问题由相同的“发现头等”问题引起。使用多个类加载器可能是解决它的唯一实用方法。或坚持一个版本。 – slipperyseal

-1

更改您的pom中依赖项的顺序。先导入您想要的罐子。

+0

这不能根据构造函数来选择使用哪一个, – stenix

相关问题