关于java的反编译的一些坑,反编译后代码中的$+数字是什么

    本人菜鸡一名,说的不够周到还请见谅。现在拿到一份虚机环境然后想把环境中的war还原成代码,反编译嘛,我觉得大部分人都接触过,看看源码啊啥的。先简单说说本次我用到的反编译工具。

首先说推荐的好用的工具JD,基本语法都正常,而且保留了编译后的那些内部类,方法,这匿名类方法具体我下面会说。但是有些语法糖,尤其是for循环反编译后结果有些乱,他总是把for循环的变量做成全局变量,这种时候该怎么办呢。我们就要用其他编译工具的结果做参考。

procyon,fernflower。这两个工具基本反编译结果也都很准确,但procyon对于中文字符串会成为Unicode编码,要手动改一下。

其他的反编译工具还有:CFR,Jad,小颖反编译也是基于jad的,结果都差不多。很久没更新了,或者说我没找到最新版本,Jad反编译的结果差强人意,CFR还好。

******************************工具下载*****************************************

下面给大家提供了工具下载地址:

链接:https://pan.baidu.com/s/1StEFl4PeQI6GYCzYqgxscA 密码:trwf

另外推荐一个很好用的在线反编译网站:

******************************很棒的在线反编译*****************************************

下面说说本次工作最费时间的地方,就是关于语法糖的反编译

参考文章:

https://blog.csdn.net/ol_beta/article/details/6787234

https://blog.csdn.net/danchu/article/details/54986442

语法糖(Syntactic Sugar)也叫糖衣语法,是英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语。指的是,在计算机语言中添加某种语法,这种语法能使程序员更方便的使用语言开发程序,同时增强程序代码的可读性,避免出错的机会;但是这种语法对语言的功能并没有影响。

Java中的泛型,变长参数,自动拆箱/装箱,条件编译等都是,下面做简单的介绍和分析。

简单说就是方便程序人员开发用的语法,经过编译后就变样了,打回原形。详细的大家参考上面两篇语法糖文章。

我这次遇到的大坑是关于匿名内部类的。

引用知乎的解释:

作者:夏小天
链接:https://www.zhihu.com/question/35410290/answer/220127341

匿名类即没有名字的类,在某个类内部使用,因为没有名字,别的类将无法调用它,只能在创建的时候,使用new语句声明它们。如this.addWindowListener(new WindowAdapter(){});因此,理解的时候可以将匿名类当做匿名内部类;

匿名内部类,即没有名字的内部类,正因为没有名字,所以只能用一次,程序员通常会考虑这个问题,从而精简代码。反过来说,当你发现某个类只需要被用一次的时候,不需要再单独的为此新起一个类名,只需要使用匿名内部类即可。

此外,匿名内部类必须要继承一个父类或者实现一个接口才能实现。

在我的反编译过程中,匿名内部类很多,到底有多头疼,咱们见截图
关于java的反编译的一些坑,反编译后代码中的$+数字是什么

关于java的反编译的一些坑,反编译后代码中的$+数字是什么
  因为我的愚钝,用了两天时间才参透这个问题。首先当一个类使用内部匿名类时,在编译成class这些匿名类没有归属啊,他就会在原来的类名后加序号一个个的给你生成出这些匿名类的单一文件。你要做的也很简单,根据此类中,比如上图UserDaoImpl.1。然后你找到对应这个内部匿名类 UserDaoImpl$1,两者结合一看发现这不就是new 了一个BatchPreparedStatementSetter类吗,但是这个问题很头疼的是量很大,一个类就一二百个,我都是手动调整的,如果有朋友有好办法,也请留言。
另外还有一些 UserDaoImpl后边加了$和一些方法名,变量名之类的,切实就代表这个变量是调用了此类的私有变量之类的,你结合上下文逻辑应该就能找到答案。
现在基本上大家都忙着开发新产品逻辑,很少有接触反编译了,这也是我第一次搞比较大的项目反编译。记录分享一下,希望朋友们工作顺利!