簡體   English   中英

對象不是它自己的類的“ instanceof”

[英]Object is not an 'instanceof' it's own class

我試圖尋找一些彈簧,而不用花費factoryBean。 我已插入調試器,並證明失敗是在此AbstraceBeanFactory行中:

if(!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
   return beanInstance;
}

特別是“ beanInstance instanceof FactoryBean”部分在應為true時返回false,導致我返回了factorybean而不是工廠假定要構造的bean。

我的調試器清楚地告訴我,beanInstance是org.springframework.beans.factory.config.PropertiesFactoryBean。 當我告訴eclipse擴展bean的類時,我看到它清楚地實現了FactoryBean

為了進一步測試,我去了表達式。 假設表達式:

beanInstance instanceof org.springframework.beans.factory.config.PropertiesFactoryBean

返回false。 但是beanInstance.getClass()返回

(org.springframework.beans.factory.config.PropertiesFactoryBean) (id=112)

看來我的VM對此類很困惑。 我正在嘗試找出造成這種混亂的原因,以及如何解決它?

最可能的情況似乎是多個類裝入器之間的混淆,但是我還沒有發現任何明顯的例子。 我的類路徑中應該只有PropertiesFactoryBean的一種實現。

是什么導致instanceof以這種方式失敗? 如何尋找根本原因?

順便說一句,如果相關的話,這最終是我正在調試的tomcat實例。 另外,beanInstance Object的instanceof,因此intanceof有時確實可以正常工作。

PS。 我必須手動輸入,而不是復制/粘貼。 請假設任何明顯的命名錯誤都是我的錯別字。

編輯:修復注釋中提到的括號錯誤。 我想我會那樣做。 這段代碼來自我未經修改的Spring,因此可以放心地假設代碼本身寫得很好並且可以正常工作,即使我打錯了

如果您有多個Web應用程序(或在使用Tomcat的熱部署功能的情況下,同一個Web應用程序有多個版本),則每個Web應用程序將具有自己的類加載器,以及另一個類加載器,該類加載器將Tomcat的lib文件夾(父文件夾)中的所有內容加載其他類加載器)。

因此,如果您要檢查的接口在您的戰爭內部(或戰爭所部署的庫中),並且您已部署了多個Web應用程序(可能其中一些已取消部署,但對對象的引用仍然存在),則假定它是一個類加載器問題(尤其是您已經確認實例和Class.forName上的getClass()返回不同的對象。在兩個類對象上調用getClassLoader (Tomcat的類加載器具有良好的toString方法),並且可能您知道它們來自哪個類加載器/ webapp。

可能的短期解決方法是將包含接口的jar移到war之外,並將其放入tomcat的lib文件夾中。

長期修復是為了找出根本原因並進行修復,當然:)

暫無
暫無

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

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