类信息描述后面就是每个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