jclasslib插件_在IDEA利用断点debug+解析class文件+jclasslib插件
目录
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插件相关推荐
- 【python脚本系列】利用mido库解析midi文件
[python脚本系列]利用mido库解析midi文件 Hallo大家好~~我是Lampard猿奋 昨天写了关于Midi数字化乐器接口的文章,介绍了midi是一组代表音乐参数( ...
- wordpress优化插件_专为移动设备优化的社交共享WordPress插件
wordpress优化插件 Did you know that the majority of Internet users are browsing through websites on thei ...
- 定位插件_谷歌官方发布了一款全新超实用Chrome插件,支持国内使用!
近期,谷歌官方开发并上架Chrome商店一款网页锚文本分享工具:Link to Text Fragment插件.它可以将网页文本以url的形式分享出去,当访问者打开这个url时,能够直接在该网页上定位 ...
- 西门子触摸屏脚本程序_西门子触摸屏利用VBScript脚本创建csv文件
功能描述:利用VBScript脚本创建csv/txt文件 有时需要将PLC或运动控制器Simotion中的数据写到SD卡或U盘上.一种实现方法是,如果使用的是精致面板(comfort panel),可 ...
- Android 插件化原理(一),通过dex文件调用插件app代码
Android插件化原理,从以下三个问题切入: 什么是插件化 如何实现插件类的加载 如何实现插件资源的加载 什么是插件化 插件化技术最初是源于免安装运行APK的想法,这个免安装的APK就可以理解为插件 ...
- 利用pstsdk进行解析pst文件
pstsdk下载地址:https://archive.codeplex.com/?p=pstsdk 下载后,我们只需要取出pstsdk目录,并自己进行dll封装,实现提取邮件内容.主题.收件人信息,把 ...
- cass插件_南方CASS专题系列,全套教程+视频讲解+插件汇总,全部打包速带走
南方CASS专题系列,全套教程+视频讲解+插件汇总,全部打包速带走 CASS软件是基于CAD平台开发的一套集地形.地籍.空间数据建库.工程应用.土石方算量等功能为一体的软件系统:广泛应用于地形成图.地 ...
- vim 插件_你不得不知道的适用于程序员的VIM插件
在介绍最常用和最受欢迎的Vim插件之前,让我们首先了解Vim的真正含义.基本上,Vim只是另一个文本编辑器,我们可以使用它来编写和编辑文本,就像通常在Windows或Mac上使用的Sublime Te ...
- jq画布插件_超炫HTML 5开发的jQuery进度条插件
今天我们分享一个超酷的使用HTML5画布技术开发的进度条插件 - percentageloader.这个插件比普通的水平进度条使用更加炫酷的效果,图形效果类似以前我们介绍的jQuery knob插件 ...
- sublime mysql插件_开发者最常用的8款Sublime text 3插件
Sublime Text作为一个尽为人知的代码编辑器,其优点不用赘述.界面整洁美观.文本功能强大,且运行速度极快,非常适合编写代码,写文章做笔记.Sublime Text还支持Mac.Windows和 ...
最新文章
- java将按钮添加到指定位置_在运行时将按钮添加到布局
- javascript-对混合字母/数字数组进行排序
- 【深度学习】——日常知识点总结(持续更新)
- 度假式办公环境、值得拥有!珠海金山软件诚聘CV、C++、后端工程师
- 鸿蒙电视投屏软件,鸿蒙打造 未来电视就这样!荣耀智慧屏PRO深度评测
- 苹果本Win10双系统开启CPU虚拟化
- 《Android群英传》— Android 书籍
- 回答工作做好了,可能有三种情形
- java 阿拉伯数字日期转换为中文大写日期方法_java方法转换大写日期及人民币大写转换方式 .txt...
- 用计算机弹奏的成都,抖音成都怎么用计算器弹奏_抖音成都计算器乐谱_管理资源吧...
- ios android 设计图,帮你彻底搞懂 iOS 和 Android 的设计差异
- 疯狂Android讲义(第2版)
- Requests库爬虫详解
- 对mysql优缺点的思考
- cad调了比例因子没反应_大神们都在用的9个CAD制图技巧,你会用几个?
- Rails中的includes和joins的区别与用法(翻译,部分)
- 图形学(8)二维三维图形变换
- STM32超声波模块(HC-SR04\US015)测试程序-HAL库函数
- 算法题——判断四边形是否为凸四边形
- 双频无线路由器打印服务器,双频无线路由器打印服务器客户端软件_1.14.1127 (Mac)...
热门文章
- 3d工口医Android,3d口工医完整版
- c51汇编语言位操作,51单片机汇编语言教程之单片机位操作指令的详细资料说明...
- 应聘flash游戏开发面试技巧及建议
- 计算机组装训练知识总结,组装知识总结
- 百度地图--南京行政区域划分
- C语言开发七彩连珠游戏,七彩连珠游戏介绍 七彩连珠单机版运行及玩法介绍
- 实验用USB转RS-232下载线制作
- [资源分享]yslow 与firebug 修复版本Firefox35【绿色版本下载】
- OSHI 是一个免费的基于 JNA(本机)的 Java 操作系统和硬件信息库
- java如何获取全部省市_纯java获取省市区