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),和原始文件里的字节是不一样的。

posted @ 2019-07-24 17:33  龙彪  阅读(1511)  评论(0编辑  收藏  举报