Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 395|回复: 0

[Java基础知识]java中使用javap命令查看类文件

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-9-30 17:46:37 | 显示全部楼层 |阅读模式
    javap 将一个类和它的方法的一些转储信息输出到标准输出。该工具不把代码反编译为 java 源代码,但是它会把字节代码反汇编成为由 Java 虚拟机规范定义的字节代码指令。    在你需要查看编译器为你或者给你做了什么的时候,或者你想要看一处代码的改动对编译后的类文件有什么影响的时候,javap 相当有用。 现在以 StringBuffer 和 String 作为一个例子。

        下面是一个专门为例子设计的类,它有两个方法,都返回一个由0到 n 的数字组成的 String,其中 n 由调用者提供。两个方法唯一的区别在于一个使用 String 构建结果,另外一个使用 StringBuffer 构建结果。
       
      
       
       
         
       

         
       
      
    1. public class JavapTip {
    2.   public static void main(String []args) {
    3.   }
    4.   private static String withStrings(int count) {
    5.     String s ="";
    6.     for (int i = 0; i < count; i++) {
    7.       s += i;
    8.     }
    9.     return s;
    10.   }
    11.   private static String withStringBuffer(int count) {
    12.     StringBuffer sb = new StringBuffer();
    13.     for (int i = 0; i < count; i++) {
    14.       sb.append(i);
    15.     }
    16.     return sb.toString();
    17.    }
    18. }
    复制代码
    现在让我们看看对这个类使用&#65533;c 选项运行 javap 的输出。
    -c 选项告诉 javap反汇编在类中遇到的字节代码。
    运行方式如下: C:java>javac JavapTip.java C:java>javap -c -private JavapTip
    此命令的输出为:

    1. Compiled from "JavapTip.java"
    2. public class JavapTip {
    3.   public JavapTip();
    4.     Code:
    5.        0: aload_0
    6.        1: invokespecial #1  // Method java/lang/Object."< init>":()V
    7.        4: return
    8.   public static void main(java.lang.String[]);
    9.     Code:
    10.        0: return
    11.   private static java.lang.String withStrings(int);
    12.     Code:
    13.        0: ldc           #2     // String
    14.        2: astore_1
    15.        3: iconst_0
    16.        4: istore_2
    17.        5: iload_2
    18.        6: iload_0
    19.        7: if_icmpge     35
    20.       10: new           #3   // class java/lang/StringBuilder
    21.       13: dup
    22.       14: invokespecial #4   // Method java/lang/StringBuilder."< init>":()V
    23.       17: aload_1
    24.       18: invokevirtual #5  
    25.                        // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
    26.       21: iload_2
    27.       22: invokevirtual #6   // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
    28.       25: invokevirtual #7   // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
    29.       28: astore_1
    30.       29: iinc          2, 1
    31.       32: goto          5
    32.       35: aload_1
    33.       36: areturn
    34.   private static java.lang.String withStringBuffer(int);
    35.     Code:
    36.        0: new           #8   // class java/lang/StringBuffer
    37.        3: dup
    38.        4: invokespecial #9   // Method java/lang/StringBuffer."< init>":()V
    39.        7: astore_1
    40.        8: iconst_0
    41.        9: istore_2
    42.       10: iload_2
    43.       11: iload_0
    44.       12: if_icmpge     27
    45.       15: aload_1
    46.       16: iload_2
    47.       17: invokevirtual #10    // Method java/lang/StringBuffer.append:(I)Ljava/lang/StringBuffer;
    48.       20: pop
    49.       21: iinc          2, 1
    50.       24: goto          10
    51.       27: aload_1
    52.       28: invokevirtual #11   // Method java/lang/StringBuffer.toString:()Ljava/lang/String;
    53.       31: areturn
    54. }
    复制代码
    如果你以前没有看过 Java 汇编器,那么这个输出对你来说就会比较难懂,但是你应该可以看到 withString 方法在每次循环的时候都新创建了一个 StringBuilder 实例。然后它将已有的 String 的当前值追加到 StringBuilder 上,然后追加循环的当前值。最后,它对 StringBuilder 调用 toString 并将结果赋给现有的 String 引用。 withStringBuffer 方法与这个方法正好相反,在每次循环的时候 withStringBuffer 只调用现有 StringBuffer 的 append 方法,没有创建新的对象,也没有新的 String 引用。 在这种情况下,我们已经知道了使用 StringBuffer 代替 String 是一种好的做法,但是如果我们不知道呢?那么 javap 可以帮助我们找到答案。 你并不会经常需要一个 Java 反汇编器,但是当你需要的时候,知道你自己的机器已经有一个并且用法相当简单的反汇编器当然是一件好事。如果你感兴趣,看书看看 javap 的其它选项――或许你会发现在你的环境中需要的特性。  

      
      
       
       

         
       

         
       
      
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-9 23:37 , Processed in 0.428550 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表