首先是原理,由于很青睐Jdk8的Lambda表达式的功能,笔者尝试着把服务器的jdk环境换成jdk8,但是过程总不是一帆风顺,由于项目庞大,依赖甚广,有些jar包在jdk7可以用,在Jdk8出现问题。虽然说jdk是向下兼容的升级,但是类似于AOP ,javaassist,等对字节码操作的jar包,由于是建立在低版本的,升级的时候,难免会出现各种问题。
看本人的一个报错
java.lang.ArrayIndexOutOfBoundsException: 2888612 at com.thoughtworks.paranamer.BytecodeReadingParanamer$ClassReader.readInt(BytecodeReadingParanamer.java:704) at com.thoughtworks.paranamer.BytecodeReadingParanamer$ClassReader.accept(BytecodeReadingParanamer.java:555) at com.thoughtworks.paranamer.BytecodeReadingParanamer$ClassReader.access$200(BytecodeReadingParanamer.java:315) at com.thoughtworks.paranamer.BytecodeReadingParanamer.lookupParameterNames(BytecodeReadingParanamer.java:102) at com.thoughtworks.paranamer.CachingParanamer.lookupParameterNames(CachingParanamer.java:76) at com.thoughtworks.paranamer.CachingParanamer.lookupParameterNames(CachingParanamer.java:68)
我直接截到目标的报错代码。这段代码刚好定位到paranamer-2.3.jar这个jar包。
根据猜测,本人只是按照规范的写了一段 list.stream.map(it->xxx) 也就是streamApi 的代码。居然出现问题。再定位到方法,看,基本可以断定方法是没有问题。应该是出在版本问题上。
BytecodeReadingParanamer
其实从类名也可以猜得出来,是字节码操作问题。
所以果断的更新jar包,问题消失,问题完美解决。
http://mvnrepository.com/artifact/com.thoughtworks.paranamer/paranamer/2.8
遇到相同问题的朋友可以尝试升级jar包的方法去解决