可以使用两个具有相同名称和相同包的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框架来为你做类加载