Unknown constant tag xx in class file xxx

问题背景

提供的代码给现场替换,现场的实施人员替换回馈,给的文件用不了。启服务报错:
类解析报错

当时未能给出准确答复,实施同志经尝试,说把给的整个文件夹扔进去,就咩问题了!
这个事后也没确认他最初是怎么替换的,不过对于这个异常做了分析。

从代码出发

ClassLoader.java
其实从报错也可以看到,最终是一个JNI. 原谅我这个图片的JDK版本和报错的不是同一个版本。

查阅

首先,我们需要理解,java的class文件有严格的格式要求。比如我们常知的开头的CAFE BABE。后面紧接着是Java的次版本号和主版本号。
另外,class的常量表、访问标识、类索引和父索引以及接口索引集合、字段表、方法表、属性表都有一套规定。

关于常量可以查看下面的Oracle官方jvm文档链接:

链接: 官方链接.

 CONSTANT_Utf8_info {
    u1 tag;
    u2 length;
    u1 bytes[length];
}
这个是字符串的常量数据结构,当然肯定还有其它类型的常量,他们是通过这个u1位标识的,
这个位置取值是1、3、4...20,如果class文件的结构别改变了,u1位变成别的值,那么在解析时不能被识别。
同样u2的长度错误了,也会导致后续的常量数据结构单元破坏。

总结

这个问题极大的可能是class文件被破坏,网上遇到还有因为上传文件传输模式不正确导致的类似错误1
还有是由于字符串常量长度超长导致的2:Unknown constant tag 84 in class file test.。
当然不排除jdk本身损坏,也有通过重装JDK解决的。

javap -verbose <Java文件名>

可以查看class文件的字节码内容。


  1. https://www.cnblogs.com/diyunpeng/p/8630903.html ↩︎

  2. https://issues.apache.org/jira/browse/GROOVY-2382 ↩︎

发布了33 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_39722475/article/details/105233313
今日推荐