背景
最近和同事在排查问题的过程中,需要用到反编译工具,因为不同环境表现的场景不一样,虽然通过deployed到私服的项目包各个场景应当代码都是一致的,但是抱着怀疑的心态还是试试,首先把maven 上的jar下载下来之后,用常见的反编译工具jd-gui.exe去打开它,找到我们怀疑的那个类,一看就懵逼了,编译不出来了,当时一想,尼玛是不是打的包有问题的,正好有个环境也是报错,是不是这个问题呀~ 给大家上上图
说实话当时还是比较慌得,因为以前还没遇到这种情况,然后立马叫他把本地的那个项目install一下,然后用反编译工具打开试试,因为本地install的话jar包是编译完拷贝到本地maven仓库了,于是我们打开反编译工具查看,和私服上的情况一样,其他的类都正常,就那个类反编译不了,这时我才松了一口气,因为本地项目都是正常的,虽然问题也确实出错在这个类上,但并不一定是打包有问题,很有可能是这个反编译工具有问题,笔者通过查阅资料,发现网络上搜索的最新版本大都是1.4.0,停留在2015年,抱着谨慎的态度,看到一个标题为2017.8.1最新版的,然后解压出来是这样:
看软件时间就知道是假的了
随着jdk的不断升级,反编译不出来的问题可能是会存在的,我还是想找找可能是哪些代码引起的,于是找到了这么一行代码
sysConfigs.forEach(sysConfig -> result.put(sysConfig.getName(), sysConfig.getValue()));
相信有同学已经猜出这是哪个版本的语法了~
解决工具
还是不放弃的,于是想寻找替代品,通过不懈的努力,终于找到我想要的工具:Luyten
Luyten是一款很强大的反编译工具包,是一款github的开源工具,软件功能非常强大,界面简洁明晰、操作方便快捷,设计得很人性化。
工具软件下载路径:https://github.com/deathmarine/Luyten/releases/tag/v0.5.3
我比较喜欢直接使用.jar版本,直接在页面打开目标.class或者.jar包文件,即可直观的查看反编译后的源码,很强大
下载下来后双击就可以使用了,同样的jar,我们打开试试效果:
总结
不再是ERROR了,同样在使用过程中可以总结一下它和jd-gui的区别:
1.查看jar包的时候,jd-gui是折叠的,而Luyten是展开的
2.以前在用jd-gui反编译的时候,泛型是会被擦除的,如:
List<Integer> list =newArrayList();
编译后会变成
List list =newArrayList();
因为泛型在编译期会被擦除,这个没毛病,但是Luyten反编译后的为什么没有被擦除呢?是因为jdk在编译过程中虽然擦除了泛型,但是还是通过注释对其进行了标记,如:
#4 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
这就解释的通为什么Luyten还是能够找回来没擦除之前的类型,毕竟能回归最原始的文件对程序员越有利。
虽然不是jar的问题,但是问题我们还是解决了,也是非常有意思的问题,可能这种现象你代码里有但是还遇不到这种场景和报错,下次给大家讲讲~
原作者:小葵花哥哥转载请注明出处,商业用途请于作者联系!
本文暂时没有评论,来添加一个吧(●'◡'●)