深入理解Java Class文件格式(九)
经过前八篇关于class文件的博客, 关于class文件格式的内容也基本上讲完了。 本文是关于class文件格式的最后一篇。 在这篇博客中, 将会讲解关于方法的几个属性。 理解这篇博客的内容, 对于理解JVM执行引擎起着重要作用。 关于虚拟机执行引擎有关的内容, 会在本专栏后面的博客中涉及。 在前面几篇博客中, 我们知道在class文件中描述一个方法, 会使用一个method_info
经过前八篇关于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;
更多关于深入理解Java的文章, 请关注我的专栏 : http://blog.csdn.net/column/details/zhangjg-java-blog.html
更多关于Java和Android等其他技术的文章, 请关注我的博客: http://blog.csdn.net/zhangjg_blog
更多推荐


所有评论(0)