是否可以在java中导入和使用两个具有相同名称和包的不同类?
例如,假设我有两个名为“com.foo.Bar”的类略有不同。我希望能够同时使用两者,但我有一个限制(因为愚蠢的反射废话)迫使我保持名称和包装相同。
是否有java的某些功能可以导入并隔离每个类?
详细说明,我改变了我的avro架构,它们应该不会被改变(哎呀!)现在我想回去更改旧的avro文件,这些文件无法用我的新文件读取架构到我的新架构可以读取的文件中。 Avro似乎强迫您使用特定的类和包名称来加载文件。
答案 0 :(得分:9)
是的。您需要实现自己的类加载器并玩一些游戏才能在运行时访问它们。
我确信这是可能的,因为我遇到了一个非常难以调试的问题,其中有人在他们的产品中有一个奇怪的类加载器,搞乱了加载库并提供了来自2个不同版本的同一文件的2个不同版本图书馆。
然而,这听起来像一个令人难以置信的坏主意。我会回去找一个解决问题的不同方法。从长远来看,这只会给你带来痛苦。哎呀,你可能已经在调查类加载器了。
编辑:具体来说,你不能“导入”两者。但是你可以在运行时访问它们。
答案 1 :(得分:5)
不,精确使用java包来避免这个问题。
答案 2 :(得分:2)
是的。它确实需要你制作自己的ClassLoader,不过
我已经在github上发了demo来了!
答案 3 :(得分:0)
Java中没有名称空间,只有C#,所以我认为你的意思是包。每个项目只能有一个完全限定的名称。
答案 4 :(得分:0)
从技术上讲,可以使用一些低级技巧来完成,例如重写字节级代码。据我所知,不同的java crypter / encrypters就是这样 - 它们有很多类叫做A.class B.class C.class等。
答案 5 :(得分:0)
如果你真的绝对 必须 做这样的事情,你可以通过使用不同的类加载器和可能的反射来实现它。
这不是Java的工作方式,也不是故意的 - 你不应该做愚蠢的事情,这会让你搞砸了。
答案 6 :(得分:0)
听起来我需要在名为com.foo.Bar的界面中定义方法签名。然后提供接口的两个不同的具体实现(比如com.foo.DefaultBar和com.foo.SpecialBar)。这样,您可以针对接口类型进行编程,并根据需要在两个不同的实现之间切换。
你能详细说明“反思废话”是什么意思吗?这可以提供对您确切问题的深入了解。
不要乱用类加载器或任何其他低级技巧。解决此类问题的最佳方法是首先要有一个清晰的设计,任何人都可以理解。
答案 7 :(得分:0)
如前所述,编写自己的Classloader或者另外使用像Equinox这样的OSGi框架为你做类加载