可以使用两个具有相同名称和相同包的java类吗?

是否可以在java中导入和使用两个具有相同名称和包的不同类?

例如,假设我有两个名为“com.foo.Bar”的类略有不同。 我希望能够同时使用两者,但我有一个限制(因为愚蠢的reflection废话)迫使我保持​​名称和包相同。

是否有一些java的function允许我导入和隔离这些类中的每一个?

为了详细说明,我改变了我的avro模式,它们不应该被更改(oops!),现在我想回去并将我的新模式无法读取的旧avro文件更改为文件我的新架构可以读取。 Avro似乎强迫您使用特定的类和包名称来加载文件。

就在这里。 您需要实现自己的类加载器并玩一些游戏才能在运行时访问它们。

我确信这是可能的,因为我遇到了一个非常难以调试的问题,其中有人在他们的产品中有一个奇怪的类加载器,它正在搞乱加载库并从库的2个不同版本提供相同文件的2个不同版本。

然而,这听起来像是一个令人难以置信的坏主意。 我会回去找一个解决问题的不同方法。 从长远来看,这只会给你带来痛苦。 哎呀,可能已经是,当你调查类加载器时。

编辑:具体来说,你不能“导入”两者。 但是您可以在运行时访问它们。

不,java包正是用来避免这个问题。

是的。 但它确实需要你制作自己的ClassLoader

我在github上做了一个演示 !

Java中没有名称空间,只有C#,所以我假设你的意思是包。 每个项目只能有一个完全限定的名称。

从技术上讲,它可以使用一些低级技巧来完成,例如重写字节级代码。 据我所知,不同的java crypter / encrypters就是这样 – 它们有很多类,叫做A.class B.class C.class等。

如果你真的绝对必须做这样的事情,你可以通过使用不同的类加载器和可能的reflection来实现它。

这不是Java的工作方式,也不是故意的 – 你不应该做愚蠢的事情,这会让事情搞砸。

听起来我需要在名为com.foo.Bar的接口中定义方法签名。 然后提供接口的两个不同的具体实现(比如com.foo.DefaultBar和com.foo.SpecialBar)。 这样,您可以针对接口类型进行编程,并根据需要在两个不同的实现之间切换。

你能详细说明“反思废话”是什么意思吗? 这可能会提供您的确切问题的见解。

不要乱用类加载器或任何其他低级欺骗。 解决此类问题的最佳方法是首先要有一个清晰的设计,任何人都可以理解。

正如已经提到的那样编写自己的类加载器或者另外使用像Equinox这样的OSGi框架来为你做类加载