(10) 深入了解Java Class文件格式(九)
转载:http://blog.csdn.net/zhangjg_blog/article/details/22432599
经过前八篇关于class文件的博客, 关于class文件格式的内容也基本上讲完了。 本文是关于class文件格式的最后一篇。 在这篇博客中, 将会讲解关于方法的几个属性。 理解这篇博客的内容, 对于理解JVM执行引擎起着重要作用。 关于虚拟机执行引擎有关的内容, 会在本专栏后面的博客中涉及。
在前面几篇博客中, 我们知道在class文件中描述一个方法, 会使用一个method_info 。 这个method_info中存放了方法的修饰符标志位,还引用了常量池中的项, 这些常量池数据项描述了在当前类中定义的某个方法的方法名, 方法的描述符。 关于这部分的内容, 请参考我之前的博客:深入理解Java Class文件格式(七) 。
但是method_info中并没有存放方法的字节码, 也就是指令。 我们知道, 对于一个方法来说, 只要它不是抽象的(抽象类中的抽象方法或者接口中的方法), 那么肯定就会存在指令。 那么这些指令存放在哪里呢? 还有, 方法中的异常处理器(try-catch块)是如何在class文件中表述的? 方法声明抛出的异常是如何描述的呢? 如果你对这几个问题感兴趣, 或许你会在这篇博客中找到答案, 或者受到一些启发。
为了知识的连贯性, 我们首先简单回顾一下method_info的结构, 因为method_info与本文有着密切的关系。method_info 的结构如下:
深入理解Java Class文件格式(七)这篇博客中已经讲解过access_flags , name_index, descriptor_index 。 他们分别描述方法的访问修饰符, 方法名和方法描述符。 从上图可以看出, method_info中还有attributes_count和attributes。 也就是说每个方法可以有另个或多个属性。 本文要讲解的方法中的字节码指令, 异常处理器和方法声明抛出的异常, 都存放在这些属性中。
Code属性
LineNumberTable属性
LocalVariableTable属性
Exceptions属性
总结
- package com.jg.zhang;
- public class Test {
- public void test() throws Exception{
- int localVar = 0;
- try{
- Class.forName("com.jg.zhang.Person");
- }catch(ClassNotFoundException e){
- throw e;
- }finally{
- System.out.println(localVar);
- }
- }
- }
反编译后的test方法部分(省略了常量池等信息):
- public void test() throws java.lang.Exception;
- flags: ACC_PUBLIC
- Exceptions:
- throws java.lang.Exception
- Code:
- stack=2, locals=4, args_size=1
- 0: iconst_0
- 1: istore_1
- 2: ldc #18 // String com.jg.zhang.Person
- 4: invokestatic #20 // Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;
- 7: pop
- 8: goto 24
- 11: astore_2
- 12: aload_2
- 13: athrow
- 14: astore_3
- 15: getstatic #26 // Field java/lang/System.out:Ljava/io/PrintStream;
- 18: iload_1
- 19: invokevirtual #32 // Method java/io/PrintStream.println:(I)V
- 22: aload_3
- 23: athrow
- 24: getstatic #26 // Field java/lang/System.out:Ljava/io/PrintStream;
- 27: iload_1
- 28: invokevirtual #32 // Method java/io/PrintStream.println:(I)V
- 31: return
- Exception table:
- from to target type
- 2 8 11 Class java/lang/ClassNotFoundException
- 2 14 14 any
- LineNumberTable:
- line 7: 0
- line 11: 2
- line 13: 8
- line 15: 12
- line 16: 14
- line 17: 15
- line 18: 22
- line 17: 24
- line 20: 31
- LocalVariableTable:
- Start Length Slot Name Signature
- 0 32 0 this Lcom/jg/zhang/Test;
- 2 30 1 localVar I
- 12 2 2 e Ljava/lang/ClassNotFoundException;
(10) 深入了解Java Class文件格式(九)的更多相关文章
- (6) 深入理解Java Class文件格式(五)
前情回顾 本专栏的前几篇博文, 对class文件中的常量池进行了详细的解释. 前文讲解了常量池中的7种数据项, 它们分别是: CONSTANT_Utf8_info CONSTANT_NameAndTy ...
- (5) 深入理解Java Class文件格式(四)
转载:http://blog.csdn.net/zhangjg_blog/article/details/21658415 前情回顾 在上一篇博客深入理解Java Class文件格式(三) 中, ...
- (4) 深入理解Java Class文件格式(三)
转载:http://blog.csdn.net/zhangjg_blog/article/details/21557357 首先, 让我们回顾一下关于class文件格式的之前两篇博客的主要内容. 在 ...
- “全栈2019”Java第九十九章:局部内部类与继承详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第二十九章:数组详解(中篇)
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第十九章:关系运算符、条件运算符和三元运算符
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- Java集合(九)哈希冲突及解决哈希冲突的4种方式
Java集合(九)哈希冲突及解决哈希冲突的4种方式 一.哈希冲突 (一).产生的原因 哈希是通过对数据进行再压缩,提高效率的一种解决方法.但由于通过哈希函数产生的哈希值是有限的,而数据可能比较多,导致 ...
- Top 10 Methods for Java Arrays
作者:X Wang 出处:http://www.programcreek.com/2013/09/top-10-methods-for-java-arrays/ 转载文章,转载请注明作者和出处 The ...
- (9) 深入了解Java Class文件格式(八)
转载:http://blog.csdn.net/zhangjg_blog/article/details/22205831 在本专栏的第一篇文章 深入理解Java虚拟机到底是什么 中, 我们主要讲解了 ...
随机推荐
- iOS应用程序的生命周期
iOS应用程序一般都是由自己编写的代码和系统框架(system frameworks)组成,系统框架提供一些基本infrastructure给所有app来运行,而你提供自己编写的代码来定制app的外观 ...
- .NET中MemCached使用介绍
阅读目录 1.MemCached是什么? 2.Window中MemCached安装 3.MemCached命令 4.简单示例 MemCached是什么 MemCached是一个自由开源,高性能,分布式 ...
- Android 解析Json_fastJson
FastJSON是一个很好的java开源json工具类库,相比其他同类的json类库,它的速度的确是fast,最快!但是文档做得不好,在应用前不得不亲测一些功能. 实际上其他的json处理工具都和 ...
- NOI 1.5 44:第n小的质数
---恢复内容开始--- 描述 输入一个正整数n,求第n小的质数. 输入 一个不超过10000的正整数n. 输出 第n小的质数. 样例输入 10 样例输出 29 方法1:合数一定可以表示成一个比它小的 ...
- Leetcode: Convex Polygon
Given a list of points that form a polygon when joined sequentially, find if this polygon is convex ...
- CSS/HTML 改变鼠标指针形状
改变鼠标指针形状的方法有两种:第一种:用的来改变鼠标指针形状.另一种是:利用第三方控件的方法,而我自己最常用的是第一种:用css样式表来改变鼠标指针形状 我们先来看第一种:用来改变鼠标指针形状. 有些 ...
- 调用线程无法访问此对象,因为另一个线程拥有该对象 [c# wpf定时器程序报的错误]
WPF:Dispatcher.Invoke 方法,只有在其上创建 Dispatcher 的线程才可以直接访问DispatcherObject.若要从不同于在其上创建 DispatcherObject ...
- (转)How To Kill runaway processes After Terminating Concurrent Request
终止EBS并发请求后,解锁相关的进程. 还有种方法可以在PLSQL->tools->session 中找到并且kill Every concurrent Request uses some ...
- win10安装oracle 11g 报错 要求的结果: 5.0,5.1,5.2,6.0 6.1 之一 实际结果: 6.2
Windows10下安装Oracle11G.10G,都会提示如下信息 正在检查操作系统要求... 要求的结果: 5.0,5.1,5.2,6.0 之一 实际结果: 6.1 检查完成.此次检查的总体结果为 ...
- 关于firewalld防火墙的使用
要想使用该防火墙,应该需要安装 networkmanager 并启动其服务.因为之前使用的是 netctl 提供的wifi-menu 来连接无线网络,导致安装networkmanager之后启动 Ne ...