javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码。通过它,我们可以对照源代码和字节码,从而了解很多编译器内部的工作。

语法:

javap[ 命令选项 ] class. . .

javap命令用于解析类文件。其输出取决于所用的选项。若没有使用选项,javap将输出传递给它的类的 public 域及方法。javap将其输出到标准输出设备上。

命令选项

-help 输出javap的帮助信息。

-l 输出行及局部变量表。

-b 确保与 JDK 1.1javap的向后兼容性。

-public 只显示 public 类及成员。

-protected 只显示 protected 和 public 类及成员。

-package 只显示包、protected 和 public 类及成员。这是缺省设置。

-private 显示所有类和成员。

-J[flag] 直接将 flag 传给运行时系统。

-s 输出内部类型签名。

-c 输出类中各方法的未解析的代码,即构成Java字节码的指令。

-verbose 输出堆栈大小、各方法的 locals 及 args 数,以及class文件的编译版本

-classpath[路径] 指定javap用来查找类的路径。如果设置了该选项,则它将覆盖缺省值或 CLASSPATH 环境变量。目录用冒号分隔。

-bootclasspath[路径] 指定加载自举类所用的路径。缺省情况下,自举类是实现核心Java平台的类,位于 jrelib下面。

-extdirs[dirs] 覆盖搜索安装方式扩展的位置。扩展的缺省位置是 jrelibext。

英文说明:

C:\>javap -help Usage: javap ...

where options include:    -c                        Disassemble the code    -classpath      Specify where to find user class files    -extdirs            Override location of installed extensions    -help                     Print this usage message    -J                  Pass directly to the runtime system    -l                        Print line number and local variable tables    -public                   Show only public classes and members    -protected                Show protected/public classes and members    -package                  Show package/protected/public classes                              and members (default)    -private                  Show all classes and members    -s                        Print internal type signatures    -bootclasspath Override location of class files loaded                              by the bootstrap class loader    -verbose                  Print stack size, number of locals and args for methods                              If verifying, print reasons for failure

示例:

下面也经典的StringBuilder代替String做字符串的例子。

public class JAVAPTest {

public static void main(String[] args) {

}

public static String contactWithStringNoLoopNoPara() {

String s = "This is " + " my " + "first JAVAP test code.";

return s;

}

public static String contactWithStringNoLoop(int count) {

String s = "This is " + " my " + count + "th JAVAP test code.";

return s;

}

public static String contactWithStringLoop(int count) {

String s = "";

for (int i = 0; i

s += i;

}

return s;

}

public static String contactWithStringBufferLoop(int count) {

StringBuffer sb = new StringBuffer();

for (int i = 0; i

sb.append(i);

}

return sb.toString();

}

}

先编译:javac JAVAPTest.java

执行反编译:javap -c JAVAPTest         //注意这个地方不需要class后缀。

结果如下:

Compiled from "JAVAPTest.java"

public class JAVAPTest extends java.lang.Object{

public JAVAPTest();

Code:

0:   aload_0

1:   invokespecial   #1; //Method java/lang/Object."":()V

4:   return

public static void main(java.lang.String[]);

Code:

0:   return

public static java.lang.String contactWithStringNoLoopNoPara();

Code:

0:   ldc     #2; //String This is  my first JAVAP test code.

2:   astore_0

3:   aload_0

4:   areturn

public static java.lang.String contactWithStringNoLoop(int);

Code:

0:   new     #3; //class java/lang/StringBuilder

3:   dup

4:   invokespecial   #4; //Method java/lang/StringBuilder."":()V

7:   ldc     #5; //String This is  my

9:   invokevirtual   #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

12:  iload_0

13:  invokevirtual   #7; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;

16:  ldc     #8; //String th JAVAP test code.

18:  invokevirtual   #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

21:  invokevirtual   #9; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;

24:  astore_1

25:  aload_1

26:  areturn

public static java.lang.String contactWithStringLoop(int);

Code:

0:   ldc     #10; //String

2:   astore_1

3:   iconst_0

4:   istore_2

5:   iload_2

6:   iload_0

7:   if_icmpge       35

10:  new     #3; //class java/lang/StringBuilder

13:  dup

14:  invokespecial   #4; //Method java/lang/StringBuilder."":()V

17:  aload_1

18:  invokevirtual   #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

21:  iload_2

22:  invokevirtual   #7; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;

25:  invokevirtual   #9; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;

28:  astore_1

29:  iinc    2, 1

32:  goto    5

35:  aload_1

36:  areturn

public static java.lang.String contactWithStringBufferLoop(int);

Code:

0:   new     #11; //class java/lang/StringBuffer

3:   dup

4:   invokespecial   #12; //Method java/lang/StringBuffer."":()V

7:   astore_1

8:   iconst_0

9:   istore_2

10:  iload_2

11:  iload_0

12:  if_icmpge       27

15:  aload_1

16:  iload_2

17:  invokevirtual   #13; //Method java/lang/StringBuffer.append:(I)Ljava/lang/StringBuffer;

20:  pop

21:  iinc    2, 1

24:  goto    10

27:  aload_1

28:  invokevirtual   #14; //Method java/lang/StringBuffer.toString:()Ljava/lang/String;

31:  areturn

}

有这个结果我们可以知道。

1。contactWithStringNoLoopNoPara方法中,代码里面是字符串拼接,貌似需要是用StringBuilder替换的好。其实在看了上面的反编译结果后,已经自动组合成一个固定字符串了。因此完全没有必要使用StringBuilder。

0:   ldc     #2; //String This is  my first JAVAP test code.

2。contactWithStringNoLoop方法中,因为使用到了变量,貌似需要是用StringBuilder替换的好。其实在看了上面的反编译结果后,已经自动使用了StringBuilder。所以代码也没有必要使用StringBuilder。

3. contactWithStringLoop方法中,是循环拼接字符串,貌似需要是用StringBuilder替换的好。看了反编译后,每个循环里面都各自生成了一个StringBuilder,并将StringBuilder.toString()防赋值给我们的Sring变量。而我们希望的是只生成一个StringBuilder对象。因此改为StringBuilder的好。循环的时候改为contactWithBufferLoop的方法最好。

4.contactWithBufferLoop方法中,是循环拼接字符串。也是我们预想的步骤在执行。

java中p_javap的基本用法相关推荐

  1. Java中Date各种相关用法

    Java中Date各种相关用法 本文主要介绍Java中Date各种相关用法. AD:   Java中Date各种相关用法(一) 1.计算某一月份的最大天数 Java代码 Calendar time=C ...

  2. java中arraycopy的用法_[jdk源码阅读系列]Java中System.arraycopy()的用法

    本文转载,原文链接: 3分钟了解Java中System.arraycopy的用法 - 伊万夫斯基 - 博客园  https://www.cnblogs.com/benjieqiang/p/114288 ...

  3. Java中split函数的用法及使用示例

    Java中split函数的用法及使用示例 2010-05-04 10:21 日志原文:http://lhgc.blog.sohu.com/80444801.html java.lang.string. ...

  4. JAVA中 BufferedImage、ImageIO用法

    转载:JAVA中BufferedImage.ImageIO用法 - 邓维-java - 博客园 (cnblogs.com) BufferedImage          BufferedImage是其 ...

  5. java中compare语句的用法,compare的用法_java中 compareTo()的程序代码及用法

    compare的用法与区别? 一.用法 v. (动词) 1.compare的基本意思是"比较,对照",主要用于比较事物的典型特征及其价值,而不在于比较相同与不同. 2.compar ...

  6. java中next()和nextline()用法区别(详细说明)

    java中next和nextline用法区别 一,方法说明 二,空格的情况(tab键相当于多个空个 1.测试代码 2.中间出现空格时 3.开头出现空格时 三,回车键的情况 分析:回车键的情况 四,常见 ...

  7. Java中Steam流的用法及使用备忘

    文章目录 Java中Steam流的用法及使用备忘 一. 流的常用创建方法 1-1 使用Collection下的 stream() 和 parallelStream() 方法 1-2 使用Arrays ...

  8. java中iterator用法_java_详解Java中Iterator迭代器的用法,迭代器(Iterator)迭代 - phpStudy...

    详解Java中Iterator迭代器的用法 迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为&quo ...

  9. JAVA中split函数的用法

    JAVA中split函数的用法 只写经常使用的,并不完整. 1.基本用法,将字符串按照指定字符串进行分割,例如: public class Main {public static void main( ...

最新文章

  1. mysql 授权与回收权限_MySQL 操作命令梳理(4)-- grant授权和revoke回收权限
  2. 有关上次的字符串是否相等的比较
  3. [转] Figuring out why my SVCHOST.EXE is at 100% CPU without complicated tools in Windows 7
  4. Atitit 建立新组织集团模型的框架基本制度与一些原则
  5. Ubuntu18.04-albert编译安装记录
  6. GitHub使用教程
  7. 利用运动学实现导弹仿真飞行
  8. 电脑上怎么批量压缩图片?如何快速批量压缩图片?
  9. ReactNative实现仿微信或者通讯录快速索引功能
  10. 计算机双系统,细说如何给电脑安装双系统
  11. 计算机毕业设计Python+Django的医院排队叫号系统(源码+系统+mysql数据库+Lw文档)
  12. Multisim10中仿真时间步长与数码显示管的类型有关
  13. flag.Args()和 flag.NArg()的用法
  14. Ae效果控件快速参考:模糊和锐化
  15. 浅析资源调度框架YARN
  16. windows下合并多个txt,文件
  17. 【王道数据结构】思维导图--5.2二叉树的概念(高清)
  18. win10以及win10企业版安装ubuntu子系统
  19. python 循环引用的解决方法
  20. [附源码]Python计算机毕业设计大学生体检管理系统Django(程序+LW)

热门文章

  1. 北京电视台《解码区块链》 ——国内首家真正的区块链商品溯源应用来了!
  2. Error: (‘IM002‘, ‘[IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序‘)
  3. drawrect的使用
  4. uniapp点击拨打电话
  5. ceres非线性优化(分析推导雅克比矩阵例子)
  6. PaaS 以及全套服务微服务搭建流程
  7. 什么是接口测试?这篇文章让你明白
  8. 用docker搭建家庭娱乐服务器
  9. 歌尔微电子递交上会稿:半年营收14.6亿 拟募资32亿
  10. RH134-04 计划任务