MyBatis 報錯,XXParams.class/漱壕 4 \: unescaped \ at end of component


簡單粗暴的解決方法:在那個POJO里面隨便加一個私有字段即可。

原因:字節碼常量池數量為91,反映到字節碼文件為5c,即 ASCII 里的反斜杠 \,這導致了后面的解析報錯。

先來看一下字節碼文件里的內容:

注意 0x5C 0x0A 這倆字符,0A 表示換行,當用 BufferedInputReader 讀取一個文件的時候,readLine() 以這個字符或回車符作為一行結束符。

字節碼文件中,前面的 8 個字節一般變化不大,4 字節魔數,4 字節大小版本號。

到了換行符的前面是 0x5C,表示常量池的數量,即 92 -1 = 91 個常量,同時也表示反斜杠字符 \。

正常的類后面沒有反斜杠,在加載到這一步的時候,因為找不到資源,就結束了,而反斜杠表示轉義字符,后面有沒有別的數據,NameImpl 就認為這是不對的。

我覺得這應該是 MyBatis 的 bug。

最后看一下常量池,0x0A 表示常量里第一項,這是一個方法引用:

 

常量池項目類型:

 

還發現一個問題,當以 utf-8 讀 Java 字節碼文件,最前面的四個字節 0xCA FE BA BE會被解碼為四個 U+FFFD(65533),這是一個替換字符串,當解碼器遇到一個無效的字符時,會替換為�,這時候如果再把字符串轉為字節數組,原來的一個字節就變成了表示替換字符的 3 個字節(0xEF 0xBF 0xBD),和原始文件里的字節是不一樣的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM