zoukankan      html  css  js  c++  java
  • idea字节码插件JClassLib——阅读JVM字节码

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

    生成字节码文件并查看

    查看字节码文件的方式: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;}方法。

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

    查看String类型

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

    double类型

    出现的类

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

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

    查看方法信息

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

    找到73号,再找到44号


    构造方法

  • 相关阅读:
    写一个精确定位异常的方法
    做一个牛XX的身份证号验证类(支持15位和18位)
    C#获取设备的IP和Mac类
    winfrom 倒计时控件
    一个实用价值很大的人脸关键点检测算法PFLD
    刷新WIDER Face纪录!TinaFace:人脸检测新网络,代码已开源!
    虚拟机安装教程
    python---文件路径的操作(有点意思)
    python_opencv -------->>>>>>>>>cv2.warpAffine()参数详解
    yolov5数据增强引发的思考——透视变换矩阵的创建
  • 原文地址:https://www.cnblogs.com/aslanvon/p/15053826.html
Copyright © 2011-2022 走看看