Day6-Java反编译工具:javap

javap介绍

javap是jdk工具中自带的反编译工具,它是根据class位元组码档案,反解析出当前类对应的code区(汇编指令)、本地变量表、异常表和程序码行偏移量对映表、常量池等重要资讯。不过有些资讯是得透过在编译(javac)时,指定引数才能输出。

以下为javap指令使用介绍

javap [option] <classfile>

classfile: 就是你要反编译的class档案
option: 放置参数。可在终端机中直接输数javapjavap -help即可看到有哪些参数可以使用
https://ithelp.ithome.com.tw/upload/images/20210920/20140481DlUNOdeBTY.png

option 介绍

依照参数作用的类型我大致分成三大块,如下:

-vserion:当前反编译的jdk版本


-public:仅显示公共类和成员
-protected:显示受保护的/公共类和成员
-p -private:显示所有类和成员
-package:显示程序包/受保护的/公共类和成员
-sysinfo:显示正在处理的类的系统讯息(路径、大小、日期、MD5)
-constants:显示静态最终常量


-s:列出内部类型签名
-l:列出行数和本地变量表
-c:反汇编代码
-v -vervose:输出附加讯息


准备一个名为JavapTest.java的档案,程序码如下:

package Controller;

public class JavapTest{

  public String publicString;
  protected String protectedString;
  String friendlyString;
  private String privateString;

  public static final String staticString1 = "static final";

  static {
    String staticString2 = "测试";
  }
  {
    String privateString = "javap test";
  }
  private void privateConstructor(){

  }
  int getNum(int x){
    return x+x;
  }
  protected String showProtectedString(){
    return protectedString;
  }
  public void showInfo(){
    int x = 10;
    System.out.println(privateString+x);
  }
}

将其档案进行编译,编译方式请参考Day4-java语言编译器:javac & 运行工具:java (上)
有了class档案後,即可加入不同的参数进行查看。

  • 不带有任何参数时

https://ithelp.ithome.com.tw/upload/images/20210920/20140481kCw2ZXFqm1.png

  • -version

javap -version 

https://ithelp.ithome.com.tw/upload/images/20210920/20140481JQuTbTKkbt.png
其实-version这参数作用指的是当前javap工具的版本,而非该class编译时的版本,故只要下javap -version即可查看。

  • -public

javap -public JavapTest.class

https://ithelp.ithome.com.tw/upload/images/20210920/20140481vzffDtHJV2.png

  • -protected

javap -protected JavapTest.class

https://ithelp.ithome.com.tw/upload/images/20210920/20140481oHiuk5yNEV.png

  • -p -private

javap -p JavapTest.class

javap -private JavapTest.class

https://ithelp.ithome.com.tw/upload/images/20210920/20140481DgQUcQcFuf.png

  • -package

javap -package JavapTest.class

https://ithelp.ithome.com.tw/upload/images/20210920/20140481t38xZ1LAgm.png

  • -sysinfo

javap -sysinfo JavapTest.class

https://ithelp.ithome.com.tw/upload/images/20210920/20140481BomlxYrhti.png

  • -constants

javap -constants JavapTest.class

https://ithelp.ithome.com.tw/upload/images/20210920/20140481PwDy5rcDbc.png

  • -s

javap -s JavapTest.class

https://ithelp.ithome.com.tw/upload/images/20210920/20140481IR3iveOf3c.png

  • -l

javap -l JavapTest.class

https://ithelp.ithome.com.tw/upload/images/20210920/20140481YsTrnj8AGc.png

  • -c

javap -c JavapTest.class

https://ithelp.ithome.com.tw/upload/images/20210920/20140481TNIpDcDGbt.png

  • -v -verbose

javap -v JavapTest.class

javap -verbose JavapTest.class

https://ithelp.ithome.com.tw/upload/images/20210920/201404817V1mcSDUtB.png
https://ithelp.ithome.com.tw/upload/images/20210920/20140481bJGMsn0HQZ.png
https://ithelp.ithome.com.tw/upload/images/20210920/20140481e1djhGmyIV.png

总结

最常使用到的参数大概只有-l-c-v,不过在使用这些参数时,要特别注意,显示出来的可能只会有protected以上的级别,若要查看全部的类别时,再多加上-p 参数即可。
例:

javap -l JavaTest.class

https://ithelp.ithome.com.tw/upload/images/20210920/20140481YsTrnj8AGc.png

javap -l -p JavaTest.class

https://ithelp.ithome.com.tw/upload/images/20210920/20140481sSqCxjsWDq.png


<<:  [想试试看JavaScript ] 事件物件

>>:  Progressive Web App Badging API 入门实做 (8)

共享资料夹&硬碟管理总结

经过「安全」的硬碟部署,最後设置共享资料夹来「驱动」硬碟 确认unRaid Array启动後,转到 ...

Day 23 - 绿专案管理(Green Project Management)

图片来源 继续延续前几篇的话题, 好巧不巧本月(2021年10月)刚出刊的专案经理杂志的封面故事,...

[Day16] 检讨会议这样开,就可惜了

我认为整个 Scrum 架构中,对系统以及最终的自组织目标,最重要、最有价值的一场活动,就是检讨会议...

Angular 深入浅出三十天:表单与测试 Day01 - 前言

何谓表单? 维基百科是这样说的: 表单是一种带有空格可用於书写以及能选择和勾选相似内容的文件。 表...

资产分类准则(asset classification guideline)

分类方案适用於整个组织。RD负责人定义一个是不合适的。此外,由於发布了资产分类准则,这意味着分类方...