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号





构造方法

idea字节码插件JClassLib——阅读JVM字节码的更多相关文章

  1. jQuery.qrcode二维码插件生成网页二维码

    如果是一个固定的二维码,我们只需要在网上找个地方生成图片,然后放上图片就可以了.但如果是地址不固定需要根据页面来生成的话.就有两种做法,一个是后端根据页面做一个动态的二维码.一种是前端使用插件生成. ...

  2. jquery.qrcode二维码插件生成彩色二维码

    jquery.qrcode.js 是居于jquery类库的绘制二维码的插件,用它来实现二维码图形渲染支持canvas和table两种绘图方式. (jquery.qrcode.js 设置显示方式为tab ...

  3. jvm源码解读--20 结合jvm源码理解 java 设计模式 模板方法

    write by 张艳涛 前言: 在学习jvm之前,看过设计模式的书,知道模板方法的设计模式,今天在看java并发编程的艺术里面关于AbstractQueuedSynchronizer 用法,这个就使 ...

  4. JVM 字节码(四)静态方法、构造代码、this 以及 synchronized 关键字

    JVM 字节码(四)静态方法.构造代码.this 以及 synchronized 关键字 一.静态代码 public class ByteCodeStatic { private static fin ...

  5. JVM 字节码(三)异常在字节码中的处理(catch 和 throws)

    JVM 字节码(三)异常在字节码中的处理(catch 和 throws) 在 ClassFile 中到底是如何处理异常的呢? 一.代码块异常 catch catch 中的异常代码块在异常是如何处理的呢 ...

  6. JVM 字节码(二)方法表详解

    JVM 字节码(二)方法表和属性表 上一节中对 ClassFile 的整体进行了五个详细的说明, 本节围绕 ClassFile 最重要的一个内容 - 方法表的 Code 属性展开 ,更多 JVM Me ...

  7. JVM 字节码(一)字节码规范

    JVM 字节码(一)字节码规范 JVM 学习资源 Java ClassFile 字节码规范(Oracle) Java 虚拟机规范(Java SE 7 中文版) (周志明等译) Java 反编译工具 - ...

  8. 从jvm字节码指令看i=i++和i=++i的区别

    1. 场景的产生 先来看下下面代码展示的两个场景 @Testvoid testIPP() { int i = 0; for (int j = 0; j < 10; j++) { i = i++; ...

  9. 初探JVM字节码

    作者: LemonNan 原文地址: https://juejin.im/post/6885658003811827725 代码地址: https://github.com/LemonLmNan/By ...

随机推荐

  1. c++ 的父类 new 重载, 子类new 对象的时候会调用父类的operater new

    子类在new 对象的 时候  父类的new 进行了重载,那么会调用父类的operater new() 函数 #include <iostream> #include <string& ...

  2. 安装npm后,nrm ls报错问题

    一.nrm : 无法加载文件 E:\nodejs\nrm.ps1,因为在此系统上禁止运行脚本.有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135 ...

  3. 利用 cgroup 的 cpuset 控制器限制进程的 CPU 使用

    最近在做一些性能测试的事情,首要前提是控制住 CPU 的使用量.最直观的方法无疑是安装 Docker,在每个配置了参数的容器里运行基准程序. 对于计算密集型任务,在只限制 CPU 的需求下,直接用 L ...

  4. 几张图搞懂 NodeJS 的流

    假设我们现在要盖一座房子,我们买了一些砖块,厂家正在送货.现在我们有两个选择,一是等所有砖块都到了以后再开始动工:二是到一批砖块就开始动工,砖块到多少我们就用多少. 这两种方式哪种效率更高呢?显然是第 ...

  5. 手写Pascal解释器(三)

    目录 一.part7 抽象语法树和具体语法树(解析树) 代码实现 二.part8 一.part7 资料来源:https://ruslanspivak.com/lsbasi-part7/ 看作者博客的标 ...

  6. sort,uniq,tr,cut,eval命令

    目录 一.排序命令sort 1.格式 2.常用选项 3.例子 二.去除重复行操作命令uniq 1.格式 2.常用选项 3.示例 三.字符转换命令tr 1.格式 2.常用选项 3.参数 4.示例 四.数 ...

  7. 靶机DC-2 rbash绕过+git提权

    这个靶机和DC-1一样,一共5个flag.全部拿到通关. root@kali:/home/kali# nmap -sP 192.168.1.* 先扫一下靶机的IP地址,拿到靶机的地址为192.168. ...

  8. HCIA-物理层

    OSI七层模型 应-->表-->会-->传-->网-->数-->物理层 TCP/IP四层模型 两个主导协议 -->工业标准 应-->传-->网-- ...

  9. 【SpringBoot技术专题】「JWT技术专区」SpringSecurity整合JWT授权和认证实现

    JWT基本概念 JWT,即 JSON Web Tokens(RFC 7519),是一个广泛用于验证 REST APIs 的标准.虽说是一个新兴技术,但它却得以迅速流行. JWT的验证过程是: 前端(客 ...

  10. thunderbird发送纯文本邮件

    向邮件列表中发邮件时,要求邮件格式必须是纯文本格式的,在thunderbird中,邮件格式(plain text或者html格式)在[工具->账户设置->[账户名称]->通讯录]下的 ...