美文网首页
查看Java字节码内容的几种方式

查看Java字节码内容的几种方式

作者: tinyvampirepudg | 来源:发表于2022-03-16 18:32 被阅读0次

    1、javap

    通过javacjavap查看:先通过javac.java文件编译成.class字节码文件,然后通过javap -verbose分析字节码。

    (base) tinytongtongdeMacBook-Pro% javac JVMRunTimeStorageTest.java
    (base) tinytongtongdeMacBook-Pro% javap -verbose JVMRunTimeStorageTest
    

    这样你就能看到你的字节码信息了。

    示例如下:

    Classfile /Users/wangjianzhou/Documents/workspace/java/JavaStudy/src/com/tinytongtong/javastudy/jvm/JVMRunTimeStorageTest.class
      Last modified Mar 16, 2022; size 657 bytes
      MD5 checksum a13778df0b853b554f2a5da237c53672
      Compiled from "JVMRunTimeStorageTest.java"
    public class com.tinytongtong.javastudy.jvm.JVMRunTimeStorageTest
      minor version: 0
      major version: 52
      flags: ACC_PUBLIC, ACC_SUPER
    Constant pool:
       #1 = Methodref          #5.#21         // java/lang/Object."<init>":()V
       #2 = Double             2.0d
       #4 = Class              #22            // com/tinytongtong/javastudy/jvm/JVMRunTimeStorageTest
       #5 = Class              #23            // java/lang/Object
       #6 = Utf8               <init>
       #7 = Utf8               ()V
       #8 = Utf8               Code
       #9 = Utf8               LineNumberTable
      #10 = Utf8               main
      #11 = Utf8               ([Ljava/lang/String;)V
      #12 = Utf8               add
      #13 = Utf8               (I)I
      #14 = Utf8               add1
      #15 = Utf8               add2
      #16 = Utf8               ()I
      #17 = Utf8               foreach
      #18 = Utf8               StackMapTable
      #19 = Utf8               SourceFile
      #20 = Utf8               JVMRunTimeStorageTest.java
      #21 = NameAndType        #6:#7          // "<init>":()V
      #22 = Utf8               com/tinytongtong/javastudy/jvm/JVMRunTimeStorageTest
      #23 = Utf8               java/lang/Object
    {
      public com.tinytongtong.javastudy.jvm.JVMRunTimeStorageTest();
        descriptor: ()V
        flags: ACC_PUBLIC
        Code:
          stack=1, locals=1, args_size=1
             0: aload_0
             1: invokespecial #1                  // Method java/lang/Object."<init>":()V
             4: return
          LineNumberTable:
            line 8: 0
    
      public static void main(java.lang.String[]);
        descriptor: ([Ljava/lang/String;)V
        flags: ACC_PUBLIC, ACC_STATIC
        Code:
          stack=0, locals=1, args_size=1
             0: return
          LineNumberTable:
            line 12: 0
    
      public static int add(int);
        descriptor: (I)I
        flags: ACC_PUBLIC, ACC_STATIC
        Code:
          stack=2, locals=3, args_size=1
             0: iconst_1
             1: istore_1
             2: iconst_2
             3: istore_2
             4: iload_1
             5: iload_2
             6: iadd
             7: iload_0
             8: iadd
             9: ireturn
          LineNumberTable:
            line 28: 0
            line 29: 2
            line 30: 4
    
      public static int add1(int);
        descriptor: (I)I
        flags: ACC_PUBLIC, ACC_STATIC
        Code:
          stack=4, locals=5, args_size=1
             0: lconst_1
             1: lstore_1
             2: ldc2_w        #2                  // double 2.0d
             5: dstore_3
             6: lload_1
             7: l2d
             8: dload_3
             9: dadd
            10: iload_0
            11: i2d
            12: dadd
            13: d2i
            14: ireturn
          LineNumberTable:
            line 42: 0
            line 43: 2
            line 44: 6
    
      public static int add2();
        descriptor: ()I
        flags: ACC_PUBLIC, ACC_STATIC
        Code:
          stack=2, locals=3, args_size=0
             0: iconst_1
             1: istore_0
             2: iconst_2
             3: istore_1
             4: iload_0
             5: iload_1
             6: iadd
             7: istore_2
             8: iload_2
             9: bipush        10
            11: iadd
            12: ireturn
          LineNumberTable:
            line 55: 0
            line 56: 2
            line 57: 4
            line 58: 8
    
      public static int foreach(int);
        descriptor: (I)I
        flags: ACC_PUBLIC, ACC_STATIC
        Code:
          stack=2, locals=3, args_size=1
             0: iconst_0
             1: istore_1
             2: iconst_0
             3: istore_2
             4: iload_2
             5: iload_0
             6: if_icmpge     19
             9: iload_1
            10: iload_2
            11: iadd
            12: istore_1
            13: iinc          2, 1
            16: goto          4
            19: iload_1
            20: ireturn
          LineNumberTable:
            line 70: 0
            line 71: 2
            line 72: 9
            line 71: 13
            line 74: 19
          StackMapTable: number_of_entries = 2
            frame_type = 253 /* append */
              offset_delta = 4
              locals = [ int, int ]
            frame_type = 250 /* chop */
              offset_delta = 14
    }
    SourceFile: "JVMRunTimeStorageTest.java"
    

    demo-JVMRunTimeStorageTest

    2、ASM Bytecode Outline 插件

    给IDE安装ASM Bytecode Outline插件。

    安装好之后,重启IDE。

    接着选择对应的java文件,右键 --> Show Bytecode outline,可以看到ASM的输出,如下图所示

    在这里插入图片描述
    在这里插入图片描述

    3、jclasslib Bytecode Viewer

    jclasslib Bytecode Viewer

    我们可以通过这个插件,以可视化的方式查看字节码中的信息,比如方法Code表中的局部变量表信息。如下图所示:

    打开对应的java文件,View --> Show Bytecode With Jclasslib

    在这里插入图片描述
    在这里插入图片描述

    我们可以看到局部变量表的长度。

    相关文章

      网友评论

          本文标题:查看Java字节码内容的几种方式

          本文链接:https://www.haomeiwen.com/subject/henpdrtx.html