簡體   English   中英

可以使用兩個具有相同名稱和相同包的java類嗎?

[英]Possible to use two java classes with same name and same package?

是否可以在java中導入和使用兩個具有相同名稱和包的不同類?

例如,假設我有兩個名為“com.foo.Bar”的類略有不同。 我希望能夠同時使用兩者,但我有一個限制(因為愚蠢的反射廢話)迫使我保持​​名稱和包相同。

是否有一些java的功能允許我導入和隔離這些類中的每一個?

為了詳細說明,我改變了我的avro模式,它們應該不會被更改(哎呀!)現在我想回去並將使用我的新模式無法讀取的舊avro文件更改為文件我的新架構可以讀取。 Avro似乎強迫您使用特定的類和包名稱來加載文件。

就在這里。 您需要實現自己的類加載器並玩一些游戲才能在運行時訪問它們。

我確信這是可能的,因為我遇到了一個非常難以調試的問題,其中有人在他們的產品中有一個奇怪的類加載器,它正在搞亂加載庫並從庫的2個不同版本提供相同文件的2個不同版本。

然而,這聽起來像一個不可思議的壞主意。 我會回去找一個解決問題的不同方法。 從長遠來看,這只會給你帶來痛苦。 哎呀,它可能已經是,因為你調查類加載器。

編輯:具體來說,你不能“導入”兩者。 但是您可以在運行時訪問它們。

不,正是使用java包來避免這個問題。

是的。 但它確實需要你制作自己的ClassLoader

我在github上做了一個演示

Java中沒有名稱空間,只有C#,所以我認為你的意思是包。 每個項目只能有一個完全限定的名稱。

從技術上講,它可以使用一些低級技巧來完成,例如重寫字節級代碼。 據我所知,不同的java crypter / encrypters就是這樣 - 它們有很多類叫做A.class B.class C.class等。

如果你真的絕對必須做這樣的事情,你可以通過使用不同的類加載器和可能的反射來實現它。

這不是Java的工作方式,也不是故意的 - 你不應該做愚蠢的事情,這會讓事情搞砸。

聽起來我需要在名為com.foo.Bar的接口中定義方法簽名。 然后提供接口的兩個不同的具體實現(比如com.foo.DefaultBar和com.foo.SpecialBar)。 這樣,您可以針對接口類型進行編程,並根據需要在兩個不同的實現之間切換。

你能詳細說明“反思廢話”是什么意思嗎? 這可能會提供您的確切問題的見解。

不要亂用類加載器或任何其他低級別的技巧。 解決此類問題的最佳方法是首先要有一個清晰的設計,任何人都可以理解。

正如已經提到的那樣編寫自己的Classloader或者另外使用像Equinox這樣的OSGi框架來為你做類加載

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM