簡單粗暴的解決方法:在那個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),和原始文件里的字節是不一樣的。
