介绍一个超好用的反编译工具_java

 

最近和同事在排查问题的过程中,需要用到反编译工具,因为不同环境表现的场景不一样,虽然通过deployed到私服的项目包各个场景应当代码都是一致的,但是抱着怀疑的心态还是试试,首先把maven 上的jar下载下来之后,用常见的反编译工具jd-gui.exe去打开它,找到我们怀疑的那个类,一看就懵逼了,编译不出来了,当时一想,尼玛是不是打的包有问题的,正好有个环境也是报错,是不是这个问题呀~ 给大家上上图

介绍一个超好用的反编译工具_java_02

 

 

说实话当时还是比较慌得,因为以前还没遇到这种情况,然后立马叫他把本地的那个项目install一下,然后用反编译工具打开试试,因为本地install的话jar包是编译完拷贝到本地maven仓库了,于是我们打开反编译工具查看,和私服上的情况一样,其他的类都正常,就那个类反编译不了,这时我才松了一口气,因为本地项目都是正常的,虽然问题也确实出错在这个类上,但并不一定是打包有问题,很有可能是这个反编译工具有问题,笔者通过查阅资料,发现网络上搜索的最新版本大都是1.4.0,停留在2015年,抱着谨慎的态度,看到一个标题为2017.8.1最新版的,然后解压出来是这样:

 

介绍一个超好用的反编译工具_java_03

 

看软件时间就知道是假的了,你特么哄我呢~

随着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,我们打开试试效果:

介绍一个超好用的反编译工具_java_04

 

 

不再是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的问题,但是问题我们还是解决了,也是非常有意思的问题,可能这种现象你代码里有但是还遇不到这种场景和报错,下次给大家讲讲~

 

https://mp.weixin.qq.com/s/yzYPDy9LmX5o5qsxvigkbw