本章节继续学习属性相关信息
解析属性表
Code属性
Code时变长属性,只存在于method_info结构中。Code属性中存放字节码等方法相关信息,其结构定义如下:
|
|
max_stack给出操作数栈的最大深度,max_locals给出局部变量表大小。接着是字节码,存在u1表中。最后时异常处理表和属性表。这些信息后面都会涉及到,这里就先一笔带过。相关代码位于attr_go文件中,下面列出其中一部分:
ClassFile.class的Code的class文件如下:
Exception属性
Exception是变长属性,记录方法抛出的异常表,其结构如下:
Exception属性也比较简单,不做过多解释了,相关代码位于attr_exceptions.go文件中,可自行查看。
LineNumberTable和LocalVariableTable属性
LineNumberTable属性表存放方法的行号信息,LocalVariableTable存放方法的局部变量信息。这两种属性和前面介绍的SourceFIle属性都属于调试信息,都不是运行时必需的。代码也不贴出来了,分别位于attr_line_number_table.go和attr_local_variable_table.go文件中。
完善AttributeInfo接口
8中属性已经讲完了,下面我们来完善AttributeInfo接口,在attribute_info.go文件中添加读取属性的方法:
完善ClassFile
class文件中的内容大致都理了一遍,现在可以来完善class_file.go文件中的读取方法:
最后将member_info.go文件中的readMember方法的读取属性方法放开。
测试
在搜索class文件的测试中,把class加载到了内存中,并且看到了一堆看似杂杂乱无章的数字打印到控制台,现在就来修改下测试代码,把命令行工具临时打造成一个简化版的javap。
在class_file.go和member_info.go文件中添加对应的读取方法,方法很简单,就不列出来了。
修改测试入口main.go文件:
|
|
解析class文件到这儿终于结束了。