chapter3_cf

package
v0.0.0-...-2ded9d7 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 19, 2019 License: Apache-2.0 Imports: 3 Imported by: 0

Documentation

Index

Constants

View Source
const (
	CONSTANT_Class              = 7
	CONSTANT_String             = 8
	CONSTANT_Fieldref           = 9
	CONSTANT_Methodref          = 10
	CONSTANT_InterfaceMethodref = 11
	CONSTANT_Integer            = 3
	CONSTANT_Float              = 4
	CONSTANT_Long               = 5
	CONSTANT_Double             = 6
	CONSTANT_NameAndType        = 12
	CONSTANT_Utf8               = 1
	CONSTANT_MethodHandle       = 15
	CONSTANT_MethodType         = 16
	CONSTANT_InvokeDynamic      = 18
)

*

常量数据结构如下
cp_info {
	u1 tag; -> 用来区分常量类型
	u2 info[];
}

Variables

This section is empty.

Functions

This section is empty.

Types

type AttributeInfo

type AttributeInfo interface {
	// contains filtered or unexported methods
}

*

属性表,储存了方法的字节码等信息
attribute_info {
	u2 attribute_name_index;
	u4 attribute_length;
	u1 info[attribute_length];
}

type ClassFile

type ClassFile struct {
	// contains filtered or unexported fields
}

func Parse

func Parse(classData []byte) (cf *ClassFile, err error)

func (*ClassFile) AccessFlags

func (this *ClassFile) AccessFlags() uint16

func (*ClassFile) ClassName

func (this *ClassFile) ClassName() string

func (*ClassFile) ConstantPool

func (this *ClassFile) ConstantPool() ConstantPool

func (*ClassFile) Fields

func (this *ClassFile) Fields() []*MemberInfo

func (*ClassFile) InterfaceNames

func (this *ClassFile) InterfaceNames() []string

func (*ClassFile) MajorVersion

func (this *ClassFile) MajorVersion() uint16

func (*ClassFile) Methods

func (this *ClassFile) Methods() []*MemberInfo

func (*ClassFile) MinorVersion

func (this *ClassFile) MinorVersion() uint16

*

以下相当于Getter方法,用于暴露ClassFile的属性

func (*ClassFile) SourceFileAttribute

func (self *ClassFile) SourceFileAttribute() *SourceFileAttribute

func (*ClassFile) SuperClassName

func (this *ClassFile) SuperClassName() string

type ClassReader

type ClassReader struct {
	// contains filtered or unexported fields
}

*

jvm中定义了u1,u2,u4来表示1,2,4字节的 无 符号整数
相同类型的多条数据一般按表的形式存储在class文件中,由表头和表项构成,表头是u2或者u4整数。
假设表头为10,后面就紧跟着10个表项数据

type CodeAttribute

type CodeAttribute struct {
	// contains filtered or unexported fields
}

*

CODE_ATTRIBUTE {
	u2 attribute_name_index;
	u4 attribute_length;
	u2 max_stack; -> 操作数栈的最大深度
	u2 max_locals; -> 局部变量表大小
	u4 code_length;
	u1 code[code_length];
	u2 exception_table_length;
	{
		u2 start_pc;
		u2 end_pc;
		u2 handle_pc;
		u2 catch_type;
	} exception_table[exception_table_length];
	u2 attributes_count;
	attribute_info attributes[attributes_count]
}

func (*CodeAttribute) Code

func (self *CodeAttribute) Code() []byte

func (*CodeAttribute) ExceptionTable

func (self *CodeAttribute) ExceptionTable() []*ExceptionTableEntry

func (*CodeAttribute) LineNumberTableAttribute

func (self *CodeAttribute) LineNumberTableAttribute() *LineNumberTableAttribute

*

找出行号属性

func (*CodeAttribute) MaxLocals

func (self *CodeAttribute) MaxLocals() uint

func (*CodeAttribute) MaxStack

func (self *CodeAttribute) MaxStack() uint

type ConstantClassInfo

type ConstantClassInfo struct {
	// contains filtered or unexported fields
}

*

CONSTANT_CLASS_INFO {
	u1 tag;
	u2 name_index;
}

func (*ConstantClassInfo) Name

func (self *ConstantClassInfo) Name() string

type ConstantDoubleInfo

type ConstantDoubleInfo struct {
	// contains filtered or unexported fields
}

*

常量池中double
同样特殊 八字节
CONSTANT_DOUBLE_INFO {
	u1 tag;
	u4 high_bytes;
	u4 low_bytes;
}

func (*ConstantDoubleInfo) Value

func (self *ConstantDoubleInfo) Value() float64

type ConstantFieldrefInfo

type ConstantFieldrefInfo struct {
	ConstantMemberrefInfo
}

*

字段符号引用
CONSTANT_FIELDREF_INFO {
	u1 tag;
	u2 class_index;
	u2 name_and_type_index;
}

type ConstantFloatInfo

type ConstantFloatInfo struct {
	// contains filtered or unexported fields
}

*

常量池中float
四字节
CONSTANT_FLOAT_INFO {
	u1 tag;
	u4 bytes;
}

func (*ConstantFloatInfo) Value

func (self *ConstantFloatInfo) Value() float32

type ConstantInfo

type ConstantInfo interface {
	// contains filtered or unexported methods
}

*

constant info类型的接口

type ConstantIntegerInfo

type ConstantIntegerInfo struct {
	// contains filtered or unexported fields
}

*

常量池中integer
四字节存储整数常量
CONSTANT_INTEGER_INFO {
	u1 tag;
	u4 bytes;
}

func (*ConstantIntegerInfo) Value

func (self *ConstantIntegerInfo) Value() int32

type ConstantInterfaceMethodrefInfo

type ConstantInterfaceMethodrefInfo struct {
	ConstantMemberrefInfo
}

*

接口方法符号引用
CONSTANT_INTERFACEMETHODREF_INFO {
	u1 tag;
	u2 class_index;
	u2 name_and_type_index;
}

type ConstantInvokeDynamicInfo

type ConstantInvokeDynamicInfo struct {
	// contains filtered or unexported fields
}
CONSTANT_InvokeDynamic_info {
    u1 tag;
    u2 bootstrap_method_attr_index;
    u2 name_and_type_index;
}

type ConstantLongInfo

type ConstantLongInfo struct {
	// contains filtered or unexported fields
}

*

常量池中long
特殊一些 八字节,分成高8字节和低8字节
CONSTANT_LONG_INFO {
	u1 tag;
	u4 high_bytes;
	u4 low_bytes;
}

func (*ConstantLongInfo) Value

func (self *ConstantLongInfo) Value() int64

type ConstantMemberrefInfo

type ConstantMemberrefInfo struct {
	// contains filtered or unexported fields
}

*

ConstantFieldrefInfo、ConstantMethodrefInfo、ConstantInterfaceMethodrefInfo
这三个结构体继承自ConstantMemberrefInfo
Go语言没有“继承”的概念,而是通过结构体嵌套的方式实现的

func (*ConstantMemberrefInfo) ClassName

func (self *ConstantMemberrefInfo) ClassName() string

func (*ConstantMemberrefInfo) NameAndDescriptor

func (self *ConstantMemberrefInfo) NameAndDescriptor() (string, string)

type ConstantMethodHandleInfo

type ConstantMethodHandleInfo struct {
	// contains filtered or unexported fields
}
CONSTANT_MethodHandle_info {
    u1 tag;
    u1 reference_kind;
    u2 reference_index;
}

type ConstantMethodTypeInfo

type ConstantMethodTypeInfo struct {
	// contains filtered or unexported fields
}
CONSTANT_MethodType_info {
    u1 tag;
    u2 descriptor_index;
}

type ConstantMethodrefInfo

type ConstantMethodrefInfo struct {
	ConstantMemberrefInfo
}

*

普通(非接口)方法符号引用
CONSTANT_METHODREF_INFO {
	u1 tag;
	u2 class_index;
	u2 name_and_type_index;
}

type ConstantNameAndTypeInfo

type ConstantNameAndTypeInfo struct {
	// contains filtered or unexported fields
}

*

给出字段或方法的名称和描述符
CONSTANT_NAMEANDTYPE_INFO {
	u1 tag;
	u2 name_index;
	u2 descriptor_index
}

type ConstantPool

type ConstantPool []ConstantInfo

*

常量池中主要存放两大类常量:字面量和符号引用
字面量比较接近于 Java 层面的常量概念,如文本字符串、被声明为 final 的常量值等
符号引用总结起来则包括了下面三类常量:
	1.类和接口的全限定名(即带有包名的 Class 名,如:org.lxh.test.TestClass)
	2.字段的名称和描述符(private、static 等描述符)
	3.方法的名称和描述符(private、static 等描述符)

func (ConstantPool) GetConstantInfo

func (self ConstantPool) GetConstantInfo(index uint16) ConstantInfo

*

获取常量信息

type ConstantStringInfo

type ConstantStringInfo struct {
	// contains filtered or unexported fields
}

*

string info本身不存储字符串,只存了常量池索引,这个索引指向一个CONSTANT_UTF8_INFO。
CONSTANT_STRING_INFO {
	u1 tag;
	u2 string_index;
}

func (*ConstantStringInfo) String

func (self *ConstantStringInfo) String() string

type ConstantUtf8Info

type ConstantUtf8Info struct {
	// contains filtered or unexported fields
}

*

CONSTANT_UTF8_INFO {
	u1 tag;
	u2 length;
	u1 bytes[length];
}

type ConstantValueAttribute

type ConstantValueAttribute struct {
	// contains filtered or unexported fields
}

*

CONSTANTVALUE_ATTRIBUTE {
	u2 attribute_name_index;
	u4 attribute_length;
	u2 constantvalue_index;
}

func (*ConstantValueAttribute) ConstantValueIndex

func (self *ConstantValueAttribute) ConstantValueIndex() uint16

type DeprecatedAttribute

type DeprecatedAttribute struct {
	MarkerAttribute
}

*

用于支持@Deprecated注解

type ExceptionTableEntry

type ExceptionTableEntry struct {
	// contains filtered or unexported fields
}

*

异常表

func (*ExceptionTableEntry) CatchType

func (self *ExceptionTableEntry) CatchType() uint16

func (*ExceptionTableEntry) EndPc

func (self *ExceptionTableEntry) EndPc() uint16

func (*ExceptionTableEntry) HandlerPc

func (self *ExceptionTableEntry) HandlerPc() uint16

func (*ExceptionTableEntry) StartPc

func (self *ExceptionTableEntry) StartPc() uint16

type ExceptionsAttribute

type ExceptionsAttribute struct {
	// contains filtered or unexported fields
}

*

记录方法抛出的异常表
EXCEPTIONS_ATTRIBUTE {
	u2 attribute_name_index;
	u4 attribute_length;
	u2 number_of_exceptions;
	u2 exception_index_table[number_of_exceptions];
}

func (*ExceptionsAttribute) ExceptionIndexTable

func (self *ExceptionsAttribute) ExceptionIndexTable() []uint16

type LineNumberTableAttribute

type LineNumberTableAttribute struct {
	// contains filtered or unexported fields
}

*

存放方法的行号信息,是调试信息
LINE_NUMBER_TABLE_ATTRIBUTE {
	u2 attribute_name_index;
	u4 attribute_length;
	u2 line_number_table_length;
	{
		u2 start_pc;
		u2 lint_number;
	} line_number_table[line_number_table_length];
}

func (*LineNumberTableAttribute) GetLineNumber

func (self *LineNumberTableAttribute) GetLineNumber(pc int) int

*

这里为什么用了 pc >= entry.startPc ?

紫苑注:
	看字节码,行号属性中,startPc 和 startPc 相差并不是1  有的是12 有的差16
	lineNumber 也并非递增,也存在lineNumber相等的LineNumberTableEntry
	没找到什么规律。。

type LineNumberTableEntry

type LineNumberTableEntry struct {
	// contains filtered or unexported fields
}

type MarkerAttribute

type MarkerAttribute struct {
}

*

上面两个struct的父类,其中没有任何数据

type MemberInfo

type MemberInfo struct {
	// contains filtered or unexported fields
}

*

字段/方法

func (*MemberInfo) AccessFlags

func (this *MemberInfo) AccessFlags() uint16

func (*MemberInfo) CodeAttribute

func (this *MemberInfo) CodeAttribute() *CodeAttribute

func (*MemberInfo) ConstantValueAttribute

func (this *MemberInfo) ConstantValueAttribute() *ConstantValueAttribute

func (*MemberInfo) Descriptor

func (this *MemberInfo) Descriptor() string

func (*MemberInfo) Name

func (this *MemberInfo) Name() string

type SourceFileAttribute

type SourceFileAttribute struct {
	// contains filtered or unexported fields
}

*

只会出现在ClassFile结构中,用于指出源文件名
SOURCEFILE_ATTRIBUTE {
	u2 attribute_name_index; -> 指向一个UTF8常量
	u4 attribute_length; -> 必须是2
	u2 sourcefile_index;
}

func (*SourceFileAttribute) FileName

func (self *SourceFileAttribute) FileName() string

type SyntheticAttribute

type SyntheticAttribute struct {
	MarkerAttribute
}

*

用来标记源文件中不存在的、由编译器生成的类成员,主要为了支持嵌套类(内部类)和嵌套接口

type UnparsedAttribute

type UnparsedAttribute struct {
	// contains filtered or unexported fields
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL