簡體   English   中英

訪問具有完全相同名稱的類

[英]Accessing a class with the exact same name

我有一個棘手的問題,我不確定在Java中是否可行。 我處於以下情況:

我有一個使用其他類的類A,我們將其稱為B。現在,我正在嘗試編寫第三類(但我不稱它為C),我再次將其稱為B(以確保哪個類為'B “我的意思是,在本文的其余部分中,我將其稱為B1和B2,好嗎?”。 所有這三個類都駐留在三個不同的JAR文件中。 到現在為止還挺好。

通常,類A在類路徑上找到類B(1)並將使用它。 但是現在我將包含B(2)的JAR文件放在類路徑的最開始,因此類A將找到該類而不是舊的類。 因此,我的類B(2)可以像舊的類B(1)一樣工作(實際上這是一個庫,我無法以其他任何方式自定義。這就是為什么這樣做的原因...)。

這是我的問題:在我的B(2)類中,我想加載實際的B(1)類並使用它。 到目前為止,我可以使用反射來做到這一點。 我什至可以通過反射調用方法,但不能將已加載類的實例轉換為B引用。 這是例外:

java.lang.ClassCastException: my.a.ClassB incompatible with my.a.ClassB

有誰知道我如何在B(2)類中使用B(1)類? 我對任何工作環境都很滿意...

Thanx,托馬斯。

您只能通過反射來做到這一點。

就運行時系統而言,您的兩個ClassB類是完全獨立的實體,不能互相轉換。

這有時發生在OSGi環境(具有復雜的類加載器設置)中,或者如果您以某種方式設法在Web應用程序上下文之間傳遞數據。

如果您想要一個通用接口在沒有反射的情況下調用兩者的方法,則只需創建一個:通用接口(或父類)。 並且該接口需要駐留在這兩個ClassB都可以看到的jar文件中。

例:

第一罐:接口我

第二個罐子:B類實現了I

第三個罐子:B類實施I

現在,您有兩個版本的B類,但是它們都可以轉換為I。

不用說,您應該為這里遇到的任何問題找到更好的解決方案。

也許您可以使用CDI將所需的類@Inject注入到類A中。這樣做可以幫助您模擬類並提供替代方法。 另請參見CDI的@Alternative注釋。 基本上,您使用的是接口方法,其背后的實現是在運行時或注入時選擇的。

暫無
暫無

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

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