您的位置:首页 > 编程语言 > Java开发

java虚拟机分析-字节码02

2015-11-15 12:55 239 查看
类信息描述后面就是每个Fields和Methods具体定义了。

属性个数: 0 fields

方法个数:2 methods

Method 0:

access flags=1 访问修饰符

name=#7<<init>>
这个方法的名称

descriptor=#8<()V>
这个方法的类型描述,也就是NameAndType

1 field/method attributes:

field/method attribute 0

name=#9<Code>
表示接下来是方法的什么方面的定义。Code表示堆这个方法的具体代码的定义

length=29
4个字节表示这个方法的代码长度,这些编译后的字节码长度就是29个字节,最多64K,也就是说一个方法编译后的字节码最长也就是64K,所以一个方法一般不能超过64K,此处不是说的java源码,而是编译后的字节码不能超过64K。

max stacks:1
该方法使用的最大的栈的深度

max locals:1
该方法使用的本地变量的最大个数,这两个定义在JVM加载这个类的字节码到内存的验证阶段做检查,如果发现超过了这两个值,JVM会拒绝加载这个类。

code length:5
定义了方法中的命令有5个字节

0 aload_0
引用入栈

1 invokespecial #1

4 return

0 exception table entries
表示此方法没有定义抛出的异常

1 code attributes:
表示这个方法中存在的一些代码属性描述,这些代码属性描述的是代码本身的一些额外信息,如用于调试的信息。我们知道调试时只需的代码与源码是通过行号关联在一起的。

code attribute 0:

name=#10<LineNumberTable> 代码属性LineNumberTable

length=6
6个字节都属于代码属性描述

line number table:

length=1
只有一行对应关系

start pc:0 line number:7
前两个字节对应运行时的行指针,后两个字节表示源码中的行号,这两个行号都是两个字节,对应到java源码中的行总数最多只能是65535,而字节码的总字节数也只能是65535,超过这个就不能表示了。

Method 1:

access flags=9

name=#11<main>

descriptor=#12<(Ljava/lang/String;)V>

1 field/method attribute:

field/method attribute 0

name=#9<Code>

length=42

max stack:3

max locals:1

code length:14

0 getstatic #2

3 ldc #3

5 iconst_0

6 anewarray #4

9 invokevitual #5

12 pop

13 return

0 exception table entries

1 code attributes:

code attribute 0:

name=#10<LineNumberTable>

length=10

Line number table:

length=2

start pc:0 line number:9

start pc:13 line number:10
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: