Java编译(javac)、运行(java)及反编译(jad、javap、JD-GUI、Procyon、luyten、CFR)

878 阅读3分钟

一、编译

编译就是把高级语言变成计算机可以识别的2进制语言(1和0)。

编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:

    *词法分析、*语法分析、语义检查和中间代码生成、代码优化、目标代码生成。
    
    主要是进行词法分析和语法分析,又称为源程序分析,分析过程中发现有语法错误,给出提示信息。

1.1 简单编译命令

javac TestMain.java

1.2 依赖其它jar包的编译命令

多个jar包以逗号隔开

javac -cp D:\yy\yy.jar,D\xx\xx.jar test.java

把所有jar包都放在C:\test\libs下

javac -Djava.ext.dirs=C:\test\libs test.java

二、运行

2.1 简单运行命令

java TestMain

执行时报错:错误: 找不到或无法加载主类 TestMain

报错分析:java中完整的类名应该是包名+类名 即:java 包名.类名

2.2 依赖其它jar包的运行命令

java -cp D:\yy\yy.jar,D\xx\xx.jar test

把所有jar包都放在C:\test\libs下

java  -Djava.ext.dirs=C:\test\libs test

当前目录下依赖helloant.jar 以及 lib目录下所有, example包名 Hello类名

java -cp helloant.jar;lib/*; example.Hello

2.3 class文件生成jar文件后的运行

生成jar文件(先编译生成class文件)

jar cvf 自定义名称.jar 类名.class

运行该jar文件

java –jar 自定义名称.jar

报错 自定义名称.jar中没有主清单属性

打开.jar文件中的MANIFEST.MF文件,若没有Main-Class这一行,则添加Main-Class:类名(注意类名前面必须有一个空格)

2.4 依赖其它jar包的jar文件运行

不修改命令,修改MANIFEST.MF文件

增加Class-Path: jar包位置,多个jar包之间空格隔开

Class-Path: libs/jar1.jar libs/jar2.jar libs/jar3.jar

三、反编译

计算机软件反向工程(Reverse engineering)也称为计算机软件还原工程,
是指通过对他人软件的目标程序(可执行程序)进行“逆向分析、研究”工作,
以推导出他人的软件产品所使用的思路、原理、结构、算法、处理过程、运行方法等设计要素以及源代码。

3.1 反编译-jad

解压 jad158g.win.zip可用 jad.exe 放入jdk\bin目录下

jad常用命令:

jad -o -r -sjava -dsrc GetWorkInterface.class

在当前目录生成 src\包目录\GetWorkInterface.java文件

-r表示保持原始package结构
-dsrc表示output目录为当前的src目录
-sjava表示反编译后的后缀为.java

jad -p GetWorkInterface.class > GetWorkInterface.java

在当前目录生成 GetWorkInterface.java文件

jad -o -a GetWorkInterface.class > GetWorkInterface.java

输出带字节码注释和源码的(最常用)

3.2 反编译-javap

javap 常用命令:

javap -verbose WorklistServiceImpl

javap -verbose GetWorkInterface >> 1.txt

3.3 反编译-JD-GUI

GUI界面,拉入class、jar文件即显示

3.4 反编译-procyon-decompiler

命令行界面

procyon-decompiler常用命令

java -jar C:\log\procyon-decompiler-0.5.30.jar C:\log\Test.class

java -jar C:\log\procyon-decompiler-0.5.30.jar C:\log\Test.class -o C:\log

3.5 反编译-luyten

luyten是Procyon的GUI,只需要下载luyten即可,不用下载Procyon 
luyten是图形化界面,通过File直接打开class文件即可显示源码

3.6 反编译-CFR

CFR常用命令

java -jar C:\log\cfr-0.150.jar C:\log\Test.class

java -jar C:\log\cfr-0.150.jar C:\log\Test.class --outputdir C:\log

3.7 反编译-Eclipse插件

在官网下载插件的jar包
然后将jar包放到eclipse的plugins目录下
再打开Eclipse,Eclipse->Window->Preferences->Java,此时你会发现会比原来多了一个JadClipse的选项,单击,在Path to decompiler中输入你刚才放置jad.exe的位置,也可以制定临时文件的目录。

当然在JadClipse下还有一些子选项,如Debug,Directives等,按照默认配置即可。 

基本配置完毕后,我们可以查看一下class文件的默认打开方式:Eclipse->Window->Preferences->General->Editors->File Associations我们可以看到class文件的打开方式有两个,JadClipse和Eclipse自带的Class File Viewer,而JadClipse是默认的。

全部配置完成,下面我们可以查看源码了,选择需要查看的类,按F3即可查看源码