spring-boot-devtools導致類出現ClassCastException

目錄

 

異常信息

根本原因

原因

spring-boot-devtools 


異常信息

同一個類轉換出現ClassCastException異常

java.lang.ClassCastException: com.guazi.aftermarket.dubbo.crm.mining.entity.QueryNewCustomerInfoEntity cannot be cast to com.guazi.aftermarket.dubbo.crm.mining.entity.QueryNewCustomerInfoEntity
	at com.alibaba.fastjson.serializer.ASMSerializer_3_QueryNewCustomerInfoEntity.write(Unknown Source)
	at com.alibaba.fastjson.serializer.JSONSerializer.writeWithFieldName(JSONSerializer.java:310)
	at com.alibaba.fastjson.serializer.ASMSerializer_2_DubboResult.write(Unknown Source)
	at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:281)
	at com.alibaba.fastjson.JSON.toJSONString(JSON.java:673)
	at com.alibaba.fastjson.JSON.toJSONString(JSON.java:611)
	at com.alibaba.fastjson.JSON.toJSONString(JSON.java:576)
...

 

根本原因

類加載器不一致

Java中,判斷是否爲同一個類的條件:類的全名稱+類加載器,由於類的全名稱相同,所以一定是類加載器不一致導致的類型轉換

 

原因

使用 spring-boot-devtools 時,很多"應用類"是由spring提供的org.springframework.boot.devtools.restart.classloader.RestartClassLoader加載,而不是以前的sun.misc.Launcher$AppClassLoader。

使用 spring-boot-devtools 時,日誌打印出類加載器如下:

註釋掉 spring-boot-devtools 時,打印出類加載器如下

spring-boot-devtools 

是什麼?

spring爲開發者提供了一個名爲spring-boot-devtools的模塊來使Spring Boot應用支持熱部署,提高開發者的開發效率,無需手動重啓Spring Boot應用

原理?

spring boot使用兩個classloader:不改變的類(如第三方jar)由base類加載器加載,正在開發的類由restart類加載器加載。應用重啓時,restart類加載器被扔掉重建,而base類加載器不變,這種方法意味着應用程序重新啓動通常比“冷啓動”快得多,因爲base類加載器已經可用並已填充。當我們開啓devtools後,classpath中的文件變化會導致應用自動重啓
(ps:Eclipse中保存文件即可引起classpath更新(注:需要打開自動編譯),從而觸發重啓。而IDEA則需要自己手動CTRL+F9重新編譯一下)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章