美文网首页
idea字节码插件JClassLib深入解读JVM字节码

idea字节码插件JClassLib深入解读JVM字节码

作者: Java架构大仙 | 来源:发表于2021-07-30 19:25 被阅读0次

    生成字节码文件并查看

    查看字节码文件的方式:javac 文件名.java 即可生成.class文件,但是这种方式不方便

    • java:是运行字节码文件;由java虚拟机对字节码进行解释和运行。
    • javac:是编译命令,将java源文件编译成.class字节码文件。
    • javap是 Java class文件分解器,可以反编译,也可以查看java编译器生成的字节码。
    package demo;
    
    public class HelloWorld {
        public static void main(String[] args) {
            System.out.println(HelloWorld.class);
        }
    }
    
    

    生成字节码文件:javap -v -l -c HelloWorld.class

    D:\Java\WorkSpace\Idea\s01\src\demo>javap-v-l-c HelloWorld.
    
    class
    Classfile /D:/Java/WorkSpace/Idea/s01/src/demo/HelloWorld.
    
    class
    Last modified 2021-7-23;size 413bytes
            MD5 checksum b247ab468b1e57da5311382960716000
            Compiled from"HelloWorld.java"
    
    public class demo.HelloWorld
            minor version:0
            major version:52
            flags:ACC_PUBLIC,ACC_SUPER
            Constant pool:
            #1=Methodref          #5.#14         // java/lang/Object."<init>":()V
            #2=Fieldref           #15.#16        // java/lang/System.out:Ljava/io/PrintStream;
            #3=Class              #17            // demo/HelloWorld
            #4=Methodref          #18.#19        // java/io/PrintStream.println:(Ljava/lang/Object;)V
            #5=Class              #20            // 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 SourceFile
               #13=Utf8 HelloWorld.java
               #14=NameAndType        #6:#7          // "<init>":()V
               #15=Class              #21            // java/lang/System
               #16=NameAndType        #22:#23        // out:Ljava/io/PrintStream;
               #17=Utf8 demo/HelloWorld
               #18=Class              #24            // java/io/PrintStream
               #19=NameAndType        #25:#26        // println:(Ljava/lang/Object;)V
               #20=Utf8 java/lang/Object
               #21=Utf8 java/lang/System
               #22=Utf8 out
               #23=Utf8 Ljava/io/PrintStream;
               #24=Utf8 java/io/PrintStream
               #25=Utf8 println
               #26=Utf8(Ljava/lang/Object;)V
               {
    public demo.HelloWorld();
            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 3:0
    
    public static void main(java.lang.String[]);
            descriptor:([Ljava/lang/String;)V
            flags:ACC_PUBLIC,ACC_STATIC
            Code:
            stack=2,locals=1,args_size=1
            0:getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
            3:ldc           #3                  // class demo/HelloWorld
            5:invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
            8:return
            LineNumberTable:
            line 5:0
            line 6:8
            }
            SourceFile:"HelloWorld.java"
    
    

    idea字节码插件JClassLibJ——阅读JVM字节码

    在idea中可以安装JClassLib插件,使字节码文件更具有可读性

    view-> showByteCodewith JClassLib

    public class Sample {
        private final String name;
        private final int age;
        private final double number = 0.0;
        public Sample(String name , int age){
            this.name = name;
            this.age = age;
        }
    
        public void output(String call){
            System.out.println(call + "姓名:" + name);
            System.out.println(call + "年龄:" + age);
        }
    
        public String output1(String call){
            System.out.println(call + "姓名:" + name);
            System.out.println(call + "年龄:" + age);
            return "SUCCESS";
        }
    
        public static void main(String[] args) {
            new Sample("小明" , 36).output("你好");
            new Sample("小红" , 36).output1("Hello");
        }
    }
    
    

    基本信息中列出了版本号,字段数,接口数,字段数,方法数,属性数

    常量池计数有86个,而左边的常量池信息只有85个,是因为0号是状态位,不显示。

    字段是类用public修饰符所公开的变量,属性是对字段的封装,属性的实质是方法{get;set;}方法。

    字段就是类内部用来存储数据,属性是类提供给外部调用时设置或读取 一个值。

    image

    查看String类型

    image image

    右侧显示的其实是一个指针,指向常量池72号索引,然后可以查看常量池72号索引指的是什么

    image

    double类型

    image

    出现的类

    image image

    查看属性的操作也是同理,可以这么勾选

    image

    number字段指向52号,可以查看52号的信息

    image image

    查看方法信息

    (方法名为output1,括号里面的输入参数为String,括号外面的是返回值类型,没有返回值则是V)

    找到73号,再找到44号

    image image image

    构造方法

    image

    相关文章

      网友评论

          本文标题:idea字节码插件JClassLib深入解读JVM字节码

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