在探寻Cglib动态代理实现原理时,因为使用jad反编译cglib动态生成的代理对象非常不容易阅读,循环语句被替换成了 goto 语句,十分的生涩难以理解,几经周折,找到两款能够解决眼下难题的软件:procyon 和 cfr。
网上部分同行推介使用 procyon,因为相比于 cfr 它对于 Java7 的语法糖(例如:switch 语句,cfr 反编译出来包含 goto 语句)支持更好。
写下这边博客是使用的 cfr (0.140) 和 procyon (0.5.34) ,这两个版本对于 switch 的支持都比较良好。
对于当前Cglib动态代理生成代理对象的源码反编译 cfr 生成的代码更加简练。
补1:在反编译 javassist 动态代理生成的代理类时,cfr 将 static 方法块的 throws ClassNotFoundException 省略了,procyon 和 jad 都能够反编译出。
CFR
http://www.benf.org/other/cfr/
下载链接:https://www.benf.org/other/cfr/cfr-0.140.jar
[usage]
java -jar cfr-0.140.jar --help
[example]
java -jar cfr-0.140.jar <Target>.class --outputdir .
procyon
https://bitbucket.org/mstrobel/procyon
下载链接:https://bitbucket.org/mstrobel/procyon/downloads/procyon-decompiler-0.5.34.jar
[usage]
java -jar procyon-decompiler-0.5.34.jar --help
[example]
java -jar procyon-decompiler-0.5.34.jar <Target>.class -o . //反编译class文件,并储存到当前目录(根据包名生成目录结构)
JAD
https://varaneckas.com/jad/
下载链接:https://varaneckas.com/jad/jad158g.win.zip
[usage]
jad
[example]
jad <Target>.class -o .
XJad
http://www.blogjava.net/96sd2/archive/2006/06/28/55500.html
http://www.blogjava.net/96sd2/archive/2006/02/16/31077.html
下载链接:http://www.blogjava.net/Files/96sd2/XJad2.2.rar
可视化界面,内置 Jad 1.5.8,自动生成 *.java 文件。
Java Decompiler
http://java-decompiler.github.io/
JD-GUI
下载链接:
https://github.com/java-decompiler/jd-gui/releases/download/v1.4.1/jd-gui-1.4.1.jar
https://github.com/java-decompiler/jd-gui/releases/download/v1.4.1/jd-gui-windows-1.4.1.zip
JD-Eclipse
下载链接:https://github.com/java-decompiler/jd-eclipse/releases/download/v1.0.0/jd-eclipse-site-1.0.0-RC2.zip
源码&历史版本:https://github.com/java-decompiler/jd-eclipse
JD-IntelliJ
发布资源:http://plugins.jetbrains.com/plugin/7100
源码&历史版本:https://github.com/bric3/jd-intellij
Java编译
Jar包依赖:
set CLASSPATH=%CLASSPATH%;<dir>:/root/subfolder/xx.jar;....
同时编译多个class文件:
javac -d ./ ./*.java