目录

1、在IDEA利用断点进行debug模式,观察栈帧的入栈出栈

2、在IDEA中使用javap指令对class文件进行解析

3、在IDEA中利用jclasslib插件解析.class文件

在IDEA中输入这样的代码

import java.util.function.DoubleToIntFunction;

/*

(1)现在设置的代码补全是alt+/

(2)快速注释是command+/

(3)快速格式化代码 alt+command+L

(4)利用断点进入debug模式,观察栈的栈帧和局部变量表,进栈出栈操作

进入都out/production/learnJVMdemo文件夹下,有一个当前类的.class文件,对它进行反编译

在Terminal界面下输入反编译指令:javap -v StackFrameTest.class,观察反编译的输出结果

*/

public class TestStackFrame {

public static void main(String[] args) {

System.out.println("这是main即将执行");

TestStackFrame tt = new TestStackFrame();

try {

tt.method1();

}catch (Exception e){

e.printStackTrace();

}

tt.method1();

System.out.println();

System.out.println("这是main执行完毕");

}

public void method1(){

System.out.println("这是method1即将执行");

int I=10;

int j=11;

method2();

//System.out.println(10/0); //这个会报出一个错误

System.out.println("这是method1执行完毕");

}

public void method2(){

System.out.println("这是method2即将执行");

int I=10;

int j=11;

method3();

System.out.println("这是method2执行完毕");

}

public void method3(){

System.out.println("这是method3即将执行");

int I=10;

int j=11;

System.out.println("这是method3执行完毕");

}

}

1、在IDEA利用断点进行debug模式,观察栈帧的入栈出栈

在代码某处加入红色断点

image.png

右键,进入debug模式

image.png

在下方可以观察debug窗口

image.png

点击箭头朝下的蓝色按钮,执行下一条语句

image.png

2、在IDEA中使用javap指令对class文件进行解析

对上面这段代码进行complie后,会生成.class文件,生成的.class文件在out/production文件夹下,其中learnJVMdemo是你创建的IDEA项目的名称。

image.png

在IDEA的Terminal输入指令

image.png

然后输入反编译指令,对class文件进行反编译

image.png

反编译输入的结果是(仔细分析反编译的结果,能看到学习jvm途中遇见的很多老朋友,例如常量池、局部变量表、方法等):

a1234@MacBook-Pro learnJVMdemo % javap -v TestStackFrame.class

Classfile /Users/a1234/IDEA_project/learnJVMdemo/out/production/learnJVMdemo/TestStackFrame.class

Last modified 2020年5月21日; size 1446 bytes

SHA-256 checksum 5c1b47cc1ffe73348dbbc7c2713bff73502254e51e2e528f33c84315f11f2f17

Compiled from "TestStackFrame.java"

public class TestStackFrame

minor version: 0

major version: 58

flags: (0x0021) ACC_PUBLIC, ACC_SUPER

this_class: #21 // TestStackFrame

super_class: #2 // java/lang/Object

interfaces: 0, fields: 0, methods: 5, attributes: 1

Constant pool:

#1 = Methodref #2.#3 // java/lang/Object."":()V

#2 = Class #4 // java/lang/Object

#3 = NameAndType #5:#6 // "":()V

#4 = Utf8 java/lang/Object

#5 = Utf8

#6 = Utf8 ()V

#7 = Fieldref #8.#9 // java/lang/System.out:Ljava/io/PrintStream;

#8 = Class #10 // java/lang/System

#9 = NameAndType #11:#12 // out:Ljava/io/PrintStream;

#10 = Utf8 java/lang/System

#11 = Utf8 out

#12 = Utf8 Ljava/io/PrintStream;

#13 = String #14 // 这是main即将执行

#14 = Utf8 这是main即将执行

#15 = Methodref #16.#17 // java/io/PrintStream.println:(Ljava/lang/String;)V

#16 = Class #18 // java/io/PrintStream

#17 = NameAndType #19:#20 // println:(Ljava/lang/String;)V

#18 = Utf8 java/io/PrintStream

#19 = Utf8 println

#20 = Utf8 (Ljava/lang/String;)V

#21 = Class #22 // TestStackFrame

#22 = Utf8 TestStackFrame

#23 = Methodref #21.#3 // TestStackFrame."":()V

#24 = Methodref #21.#25 // TestStackFrame.method1:()V

#25 = NameAndType #26:#6 // method1:()V

#26 = Utf8 method1

#27 = Class #28 // java/lang/Exception

#28 = Utf8 java/lang/Exception

#29 = Methodref #27.#30 // java/lang/Exception.printStackTrace:()V

#30 = NameAndType #31:#6 // printStackTrace:()V

#31 = Utf8 printStackTrace

#32 = Methodref #16.#33 // java/io/PrintStream.println:()V

#33 = NameAndType #19:#6 // println:()V

#34 = String #35 // 这是main执行完毕

#35 = Utf8 这是main执行完毕

#36 = String #37 // 这是method1即将执行

#37 = Utf8 这是method1即将执行

#38 = Methodref #21.#39 // TestStackFrame.method2:()V

#39 = NameAndType #40:#6 // method2:()V

#40 = Utf8 method2

#41 = String #42 // 这是method1执行完毕

#42 = Utf8 这是method1执行完毕

#43 = String #44 // 这是method2即将执行

#44 = Utf8 这是method2即将执行

#45 = Methodref #21.#46 // TestStackFrame.method3:()V

#46 = NameAndType #47:#6 // method3:()V

#47 = Utf8 method3

#48 = String #49 // 这是method2执行完毕

#49 = Utf8 这是method2执行完毕

#50 = String #51 // 这是method3即将执行

#51 = Utf8 这是method3即将执行

#52 = String #53 // 这是method3执行完毕

#53 = Utf8 这是method3执行完毕

#54 = Utf8 Code

#55 = Utf8 LineNumberTable

#56 = Utf8 LocalVariableTable

#57 = Utf8 this

#58 = Utf8 LTestStackFrame;

#59 = Utf8 main

#60 = Utf8 ([Ljava/lang/String;)V

#61 = Utf8 e

#62 = Utf8 Ljava/lang/Exception;

#63 = Utf8 args

#64 = Utf8 [Ljava/lang/String;

#65 = Utf8 tt

#66 = Utf8 StackMapTable

#67 = Class #64 // "[Ljava/lang/String;"

#68 = Utf8 i

#69 = Utf8 I

#70 = Utf8 j

#71 = Utf8 SourceFile

#72 = Utf8 TestStackFrame.java

{

public TestStackFrame();

descriptor: ()V

flags: (0x0001) ACC_PUBLIC

Code:

stack=1, locals=1, args_size=1

0: aload_0

1: invokespecial #1 // Method java/lang/Object."":()V

4: return

LineNumberTable:

line 9: 0

LocalVariableTable:

Start Length Slot Name Signature

0 5 0 this LTestStackFrame;

public static void main(java.lang.String[]);

descriptor: ([Ljava/lang/String;)V

flags: (0x0009) ACC_PUBLIC, ACC_STATIC

Code:

stack=2, locals=3, args_size=1

0: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;

3: ldc #13 // String 这是main即将执行

5: invokevirtual #15 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

8: new #21 // class TestStackFrame

11: dup

12: invokespecial #23 // Method "":()V

15: astore_1

16: aload_1

17: invokevirtual #24 // Method method1:()V

20: goto 28

23: astore_2

24: aload_2

25: invokevirtual #29 // Method java/lang/Exception.printStackTrace:()V

28: aload_1

29: invokevirtual #24 // Method method1:()V

32: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;

35: invokevirtual #32 // Method java/io/PrintStream.println:()V

38: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;

41: ldc #34 // String 这是main执行完毕

43: invokevirtual #15 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

46: return

Exception table:

from to target type

16 20 23 Class java/lang/Exception

LineNumberTable:

line 13: 0

line 14: 8

line 16: 16

line 19: 20

line 17: 23

line 18: 24

line 20: 28

line 21: 32

line 22: 38

line 23: 46

LocalVariableTable:

Start Length Slot Name Signature

24 4 2 e Ljava/lang/Exception;

0 47 0 args [Ljava/lang/String;

16 31 1 tt LTestStackFrame;

StackMapTable: number_of_entries = 2

frame_type = 255 /* full_frame */

offset_delta = 23

locals = [ class "[Ljava/lang/String;", class TestStackFrame ]

stack = [ class java/lang/Exception ]

frame_type = 4 /* same */

public void method1();

descriptor: ()V

flags: (0x0001) ACC_PUBLIC

Code:

stack=2, locals=3, args_size=1

0: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;

3: ldc #36 // String 这是method1即将执行

5: invokevirtual #15 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

8: bipush 10

10: istore_1

11: bipush 11

13: istore_2

14: aload_0

15: invokevirtual #38 // Method method2:()V

18: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;

21: ldc #41 // String 这是method1执行完毕

23: invokevirtual #15 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

26: return

LineNumberTable:

line 26: 0

line 27: 8

line 28: 11

line 29: 14

line 32: 18

line 33: 26

LocalVariableTable:

Start Length Slot Name Signature

0 27 0 this LTestStackFrame;

11 16 1 I I

14 13 2 j I

public void method2();

descriptor: ()V

flags: (0x0001) ACC_PUBLIC

Code:

stack=2, locals=3, args_size=1

0: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;

3: ldc #43 // String 这是method2即将执行

5: invokevirtual #15 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

8: bipush 10

10: istore_1

11: bipush 11

13: istore_2

14: aload_0

15: invokevirtual #45 // Method method3:()V

18: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;

21: ldc #48 // String 这是method2执行完毕

23: invokevirtual #15 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

26: return

LineNumberTable:

line 35: 0

line 36: 8

line 37: 11

line 38: 14

line 39: 18

line 40: 26

LocalVariableTable:

Start Length Slot Name Signature

0 27 0 this LTestStackFrame;

11 16 1 I I

14 13 2 j I

public void method3();

descriptor: ()V

flags: (0x0001) ACC_PUBLIC

Code:

stack=2, locals=3, args_size=1

0: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;

3: ldc #50 // String 这是method3即将执行

5: invokevirtual #15 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

8: bipush 10

10: istore_1

11: bipush 11

13: istore_2

14: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;

17: ldc #52 // String 这是method3执行完毕

19: invokevirtual #15 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

22: return

LineNumberTable:

line 42: 0

line 43: 8

line 44: 11

line 45: 14

line 46: 22

LocalVariableTable:

Start Length Slot Name Signature

0 23 0 this LTestStackFrame;

11 12 1 I I

14 9 2 j I

}

SourceFile: "TestStackFrame.java"

a1234@MacBook-Pro learnJVMdemo %

3、在IDEA中利用jclasslib插件解析.class文件

首先需要在IDEA中安装jclasslib插件。进入IDEA的设置

image.png

在marketpalce中搜索jclasslib然后进行安装

在marketpalce中搜索jclasslib然后进行安装

安装好之后jclasslib出现在installed界面

安装好之后jclasslib出现在installed界面

重启IDEA,然后打开一个项目代码,在view窗口有一个show bytecode with jclasslib

image.png

点击,出现下面的界面,就可以从中获取到class文件相关的信息了

image.png

jclasslib插件_在IDEA利用断点debug+解析class文件+jclasslib插件相关推荐

  1. 【python脚本系列】利用mido库解析midi文件

    [python脚本系列]利用mido库解析midi文件       Hallo大家好~~我是Lampard猿奋       昨天写了关于Midi数字化乐器接口的文章,介绍了midi是一组代表音乐参数( ...

  2. wordpress优化插件_专为移动设备优化的社交共享WordPress插件

    wordpress优化插件 Did you know that the majority of Internet users are browsing through websites on thei ...

  3. 定位插件_谷歌官方发布了一款全新超实用Chrome插件,支持国内使用!

    近期,谷歌官方开发并上架Chrome商店一款网页锚文本分享工具:Link to Text Fragment插件.它可以将网页文本以url的形式分享出去,当访问者打开这个url时,能够直接在该网页上定位 ...

  4. 西门子触摸屏脚本程序_西门子触摸屏利用VBScript脚本创建csv文件

    功能描述:利用VBScript脚本创建csv/txt文件 有时需要将PLC或运动控制器Simotion中的数据写到SD卡或U盘上.一种实现方法是,如果使用的是精致面板(comfort panel),可 ...

  5. Android 插件化原理(一),通过dex文件调用插件app代码

    Android插件化原理,从以下三个问题切入: 什么是插件化 如何实现插件类的加载 如何实现插件资源的加载 什么是插件化 插件化技术最初是源于免安装运行APK的想法,这个免安装的APK就可以理解为插件 ...

  6. 利用pstsdk进行解析pst文件

    pstsdk下载地址:https://archive.codeplex.com/?p=pstsdk 下载后,我们只需要取出pstsdk目录,并自己进行dll封装,实现提取邮件内容.主题.收件人信息,把 ...

  7. cass插件_南方CASS专题系列,全套教程+视频讲解+插件汇总,全部打包速带走

    南方CASS专题系列,全套教程+视频讲解+插件汇总,全部打包速带走 CASS软件是基于CAD平台开发的一套集地形.地籍.空间数据建库.工程应用.土石方算量等功能为一体的软件系统:广泛应用于地形成图.地 ...

  8. vim 插件_你不得不知道的适用于程序员的VIM插件

    在介绍最常用和最受欢迎的Vim插件之前,让我们首先了解Vim的真正含义.基本上,Vim只是另一个文本编辑器,我们可以使用它来编写和编辑文本,就像通常在Windows或Mac上使用的Sublime Te ...

  9. jq画布插件_超炫HTML 5开发的jQuery进度条插件

    今天我们分享一个超酷的使用HTML5画布技术开发的进度条插件 - percentageloader.这个插件比普通的水平进度条使用更加炫酷的效果,图形效果类似以前我们介绍的jQuery knob插件  ...

  10. sublime mysql插件_开发者最常用的8款Sublime text 3插件

    Sublime Text作为一个尽为人知的代码编辑器,其优点不用赘述.界面整洁美观.文本功能强大,且运行速度极快,非常适合编写代码,写文章做笔记.Sublime Text还支持Mac.Windows和 ...

最新文章

  1. java将按钮添加到指定位置_在运行时将按钮添加到布局
  2. javascript-对混合字母/数字数组进行排序
  3. 【深度学习】——日常知识点总结(持续更新)
  4. 度假式办公环境、值得拥有!珠海金山软件诚聘CV、C++、后端工程师
  5. 鸿蒙电视投屏软件,鸿蒙打造 未来电视就这样!荣耀智慧屏PRO深度评测
  6. 苹果本Win10双系统开启CPU虚拟化
  7. 《Android群英传》— Android 书籍
  8. 回答工作做好了,可能有三种情形
  9. java 阿拉伯数字日期转换为中文大写日期方法_java方法转换大写日期及人民币大写转换方式 .txt...
  10. 用计算机弹奏的成都,抖音成都怎么用计算器弹奏_抖音成都计算器乐谱_管理资源吧...
  11. ios android 设计图,帮你彻底搞懂 iOS 和 Android 的设计差异
  12. 疯狂Android讲义(第2版)
  13. Requests库爬虫详解
  14. 对mysql优缺点的思考
  15. cad调了比例因子没反应_大神们都在用的9个CAD制图技巧,你会用几个?
  16. Rails中的includes和joins的区别与用法(翻译,部分)
  17. 图形学(8)二维三维图形变换
  18. STM32超声波模块(HC-SR04\US015)测试程序-HAL库函数
  19. 算法题——判断四边形是否为凸四边形
  20. 双频无线路由器打印服务器,双频无线路由器打印服务器客户端软件_1.14.1127 (Mac)...

热门文章

  1. 3d工口医Android,3d口工医完整版
  2. c51汇编语言位操作,51单片机汇编语言教程之单片机位操作指令的详细资料说明...
  3. 应聘flash游戏开发面试技巧及建议
  4. 计算机组装训练知识总结,组装知识总结
  5. 百度地图--南京行政区域划分
  6. C语言开发七彩连珠游戏,七彩连珠游戏介绍 七彩连珠单机版运行及玩法介绍
  7. 实验用USB转RS-232下载线制作
  8. [资源分享]yslow 与firebug 修复版本Firefox35【绿色版本下载】
  9. OSHI 是一个免费的基于 JNA(本机)的 Java 操作系统和硬件信息库
  10. java如何获取全部省市_纯java获取省市区