问题背景
提供的代码给现场替换,现场的实施人员替换回馈,给的文件用不了。启服务报错:
当时未能给出准确答复,实施同志经尝试,说把给的整个文件夹扔进去,就咩问题了!
这个事后也没确认他最初是怎么替换的,不过对于这个异常做了分析。
从代码出发
其实从报错也可以看到,最终是一个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文件的字节码内容。
版权声明:本文为qq_39722475原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。