類例項物件的class型別卻不屬於該類,何解?

linyb極客之路發表於2021-10-13

前言

標題可能會讓人一頭霧水,直接上例子


如果我們在程式碼中,執行如下內容

server instanceof MvpServer

它返回的東西會是啥,如果得出正確答案的朋友,下面內容就可以不用看了。

答案是

當時看到這個答案,我真的一臉懵逼,還一度懷疑是我idea問題

排查

像這種問題,有時候真的得靠平時的積累了,類是由什麼進行載入?答案是類載入器,即使類包名一樣,類名字一樣,如果你是由不同的類載入器進行載入,則該類也是不一樣。因此我們就可以優先從類載入器排查起


在這裡插入圖片描述
從圖片就很容易看出來,server和MvpServer的類載入器不一樣。server他這個類載入器是spring devtools這個包提供的。因此解決的思路就很簡單,就查下專案中是否引入

    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>

有的話,可以直接去掉了,避免對專案產生影響。如果你確實不想去掉,你可以把當前整個執行緒的類載入器,都設定成spring-boot-devtools的類載入器,可以通過

  Thread.currentThread().setContextClassLoader();

當我們把類載入都改成一樣後,我們再來看下效果



總結

可能我們平時會背一些八股文,類載入器比如boostrap classloader、ext classloader、app classloader啥的,但有時候真的排查起問題,就會忽略了

相關文章