.class file format: Go parsing library

File extension

class

KS implementation details

License: CC0-1.0

References

This page hosts a formal specification of .class file format using Kaitai Struct. This specification can be automatically translated into a variety of programming languages to get a parsing library.

Go source code to parse .class file format

java_class.go

// Code generated by kaitai-struct-compiler from a .ksy source file. DO NOT EDIT.

import (
	"github.com/kaitai-io/kaitai_struct_go_runtime/kaitai"
	"bytes"
)


/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se19/html/jvms-4.html">Source</a>
 * @see <a href="https://docs.oracle.com/javase/specs/jls/se6/jls3.pdf">Source</a>
 * @see <a href="https://github.com/openjdk/jdk/blob/jdk-21%2B14/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/ClassConstants.java">Source</a>
 * @see <a href="https://github.com/openjdk/jdk/blob/jdk-21%2B14/src/java.base/share/native/include/classfile_constants.h.template">Source</a>
 * @see <a href="https://github.com/openjdk/jdk/blob/jdk-21%2B14/src/hotspot/share/classfile/classFileParser.cpp">Source</a>
 */
type JavaClass struct {
	Magic []byte
	VersionMinor uint16
	VersionMajor uint16
	ConstantPoolCount uint16
	ConstantPool []*JavaClass_ConstantPoolEntry
	AccessFlags uint16
	ThisClass uint16
	SuperClass uint16
	InterfacesCount uint16
	Interfaces []uint16
	FieldsCount uint16
	Fields []*JavaClass_FieldInfo
	MethodsCount uint16
	Methods []*JavaClass_MethodInfo
	AttributesCount uint16
	Attributes []*JavaClass_AttributeInfo
	_io *kaitai.Stream
	_root *JavaClass
	_parent kaitai.Struct
}
func NewJavaClass() *JavaClass {
	return &JavaClass{
	}
}

func (this JavaClass) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass) Read(io *kaitai.Stream, parent kaitai.Struct, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp1, err := this._io.ReadBytes(int(4))
	if err != nil {
		return err
	}
	tmp1 = tmp1
	this.Magic = tmp1
	if !(bytes.Equal(this.Magic, []uint8{202, 254, 186, 190})) {
		return kaitai.NewValidationNotEqualError([]uint8{202, 254, 186, 190}, this.Magic, this._io, "/seq/0")
	}
	tmp2, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.VersionMinor = uint16(tmp2)
	tmp3, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.VersionMajor = uint16(tmp3)
	if !(this.VersionMajor >= 43) {
		return kaitai.NewValidationLessThanError(43, this.VersionMajor, this._io, "/seq/2")
	}
	tmp4, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.ConstantPoolCount = uint16(tmp4)
	for i := 0; i < int(this.ConstantPoolCount - 1); i++ {
		_ = i
		var tmp5 bool;
		if (i != 0) {
			tmp6, err := this.ConstantPool[i - 1].IsTwoEntries()
			if err != nil {
				return err
			}
			tmp5 = tmp6
		} else {
			tmp5 = false
		}
		tmp7 := NewJavaClass_ConstantPoolEntry(tmp5)
		err = tmp7.Read(this._io, this, this._root)
		if err != nil {
			return err
		}
		this.ConstantPool = append(this.ConstantPool, tmp7)
	}
	tmp8, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.AccessFlags = uint16(tmp8)
	tmp9, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.ThisClass = uint16(tmp9)
	tmp10, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.SuperClass = uint16(tmp10)
	tmp11, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.InterfacesCount = uint16(tmp11)
	for i := 0; i < int(this.InterfacesCount); i++ {
		_ = i
		tmp12, err := this._io.ReadU2be()
		if err != nil {
			return err
		}
		this.Interfaces = append(this.Interfaces, tmp12)
	}
	tmp13, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.FieldsCount = uint16(tmp13)
	for i := 0; i < int(this.FieldsCount); i++ {
		_ = i
		tmp14 := NewJavaClass_FieldInfo()
		err = tmp14.Read(this._io, this, this._root)
		if err != nil {
			return err
		}
		this.Fields = append(this.Fields, tmp14)
	}
	tmp15, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.MethodsCount = uint16(tmp15)
	for i := 0; i < int(this.MethodsCount); i++ {
		_ = i
		tmp16 := NewJavaClass_MethodInfo()
		err = tmp16.Read(this._io, this, this._root)
		if err != nil {
			return err
		}
		this.Methods = append(this.Methods, tmp16)
	}
	tmp17, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.AttributesCount = uint16(tmp17)
	for i := 0; i < int(this.AttributesCount); i++ {
		_ = i
		tmp18 := NewJavaClass_AttributeInfo()
		err = tmp18.Read(this._io, this, this._root)
		if err != nil {
			return err
		}
		this.Attributes = append(this.Attributes, tmp18)
	}
	return err
}

/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7">Source</a>
 */
type JavaClass_AttributeInfo struct {
	NameIndex uint16
	AttributeLength uint32
	Info interface{}
	_io *kaitai.Stream
	_root *JavaClass
	_parent kaitai.Struct
	_raw_Info []byte
	_f_nameAsStr bool
	nameAsStr string
}
func NewJavaClass_AttributeInfo() *JavaClass_AttributeInfo {
	return &JavaClass_AttributeInfo{
	}
}

func (this JavaClass_AttributeInfo) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_AttributeInfo) Read(io *kaitai.Stream, parent kaitai.Struct, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp19, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.NameIndex = uint16(tmp19)
	tmp20, err := this._io.ReadU4be()
	if err != nil {
		return err
	}
	this.AttributeLength = uint32(tmp20)
	tmp21, err := this.NameAsStr()
	if err != nil {
		return err
	}
	switch (tmp21) {
	case "Code":
		tmp22, err := this._io.ReadBytes(int(this.AttributeLength))
		if err != nil {
			return err
		}
		tmp22 = tmp22
		this._raw_Info = tmp22
		_io__raw_Info := kaitai.NewStream(bytes.NewReader(this._raw_Info))
		tmp23 := NewJavaClass_AttributeInfo_AttrBodyCode()
		err = tmp23.Read(_io__raw_Info, this, this._root)
		if err != nil {
			return err
		}
		this.Info = tmp23
	case "Exceptions":
		tmp24, err := this._io.ReadBytes(int(this.AttributeLength))
		if err != nil {
			return err
		}
		tmp24 = tmp24
		this._raw_Info = tmp24
		_io__raw_Info := kaitai.NewStream(bytes.NewReader(this._raw_Info))
		tmp25 := NewJavaClass_AttributeInfo_AttrBodyExceptions()
		err = tmp25.Read(_io__raw_Info, this, this._root)
		if err != nil {
			return err
		}
		this.Info = tmp25
	case "LineNumberTable":
		tmp26, err := this._io.ReadBytes(int(this.AttributeLength))
		if err != nil {
			return err
		}
		tmp26 = tmp26
		this._raw_Info = tmp26
		_io__raw_Info := kaitai.NewStream(bytes.NewReader(this._raw_Info))
		tmp27 := NewJavaClass_AttributeInfo_AttrBodyLineNumberTable()
		err = tmp27.Read(_io__raw_Info, this, this._root)
		if err != nil {
			return err
		}
		this.Info = tmp27
	case "SourceFile":
		tmp28, err := this._io.ReadBytes(int(this.AttributeLength))
		if err != nil {
			return err
		}
		tmp28 = tmp28
		this._raw_Info = tmp28
		_io__raw_Info := kaitai.NewStream(bytes.NewReader(this._raw_Info))
		tmp29 := NewJavaClass_AttributeInfo_AttrBodySourceFile()
		err = tmp29.Read(_io__raw_Info, this, this._root)
		if err != nil {
			return err
		}
		this.Info = tmp29
	default:
		tmp30, err := this._io.ReadBytes(int(this.AttributeLength))
		if err != nil {
			return err
		}
		tmp30 = tmp30
		this._raw_Info = tmp30
	}
	return err
}
func (this *JavaClass_AttributeInfo) NameAsStr() (v string, err error) {
	if (this._f_nameAsStr) {
		return this.nameAsStr, nil
	}
	this._f_nameAsStr = true
	this.nameAsStr = string(this._root.ConstantPool[this.NameIndex - 1].CpInfo.(*JavaClass_Utf8CpInfo).Value)
	return this.nameAsStr, nil
}

/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.3">Source</a>
 */
type JavaClass_AttributeInfo_AttrBodyCode struct {
	MaxStack uint16
	MaxLocals uint16
	CodeLength uint32
	Code []byte
	ExceptionTableLength uint16
	ExceptionTable []*JavaClass_AttributeInfo_AttrBodyCode_ExceptionEntry
	AttributesCount uint16
	Attributes []*JavaClass_AttributeInfo
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass_AttributeInfo
}
func NewJavaClass_AttributeInfo_AttrBodyCode() *JavaClass_AttributeInfo_AttrBodyCode {
	return &JavaClass_AttributeInfo_AttrBodyCode{
	}
}

func (this JavaClass_AttributeInfo_AttrBodyCode) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_AttributeInfo_AttrBodyCode) Read(io *kaitai.Stream, parent *JavaClass_AttributeInfo, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp31, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.MaxStack = uint16(tmp31)
	tmp32, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.MaxLocals = uint16(tmp32)
	tmp33, err := this._io.ReadU4be()
	if err != nil {
		return err
	}
	this.CodeLength = uint32(tmp33)
	tmp34, err := this._io.ReadBytes(int(this.CodeLength))
	if err != nil {
		return err
	}
	tmp34 = tmp34
	this.Code = tmp34
	tmp35, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.ExceptionTableLength = uint16(tmp35)
	for i := 0; i < int(this.ExceptionTableLength); i++ {
		_ = i
		tmp36 := NewJavaClass_AttributeInfo_AttrBodyCode_ExceptionEntry()
		err = tmp36.Read(this._io, this, this._root)
		if err != nil {
			return err
		}
		this.ExceptionTable = append(this.ExceptionTable, tmp36)
	}
	tmp37, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.AttributesCount = uint16(tmp37)
	for i := 0; i < int(this.AttributesCount); i++ {
		_ = i
		tmp38 := NewJavaClass_AttributeInfo()
		err = tmp38.Read(this._io, this, this._root)
		if err != nil {
			return err
		}
		this.Attributes = append(this.Attributes, tmp38)
	}
	return err
}

/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.3">Source</a>
 */
type JavaClass_AttributeInfo_AttrBodyCode_ExceptionEntry struct {
	StartPc uint16
	EndPc uint16
	HandlerPc uint16
	CatchType uint16
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass_AttributeInfo_AttrBodyCode
	_f_catchException bool
	catchException *JavaClass_ConstantPoolEntry
}
func NewJavaClass_AttributeInfo_AttrBodyCode_ExceptionEntry() *JavaClass_AttributeInfo_AttrBodyCode_ExceptionEntry {
	return &JavaClass_AttributeInfo_AttrBodyCode_ExceptionEntry{
	}
}

func (this JavaClass_AttributeInfo_AttrBodyCode_ExceptionEntry) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_AttributeInfo_AttrBodyCode_ExceptionEntry) Read(io *kaitai.Stream, parent *JavaClass_AttributeInfo_AttrBodyCode, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp39, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.StartPc = uint16(tmp39)
	tmp40, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.EndPc = uint16(tmp40)
	tmp41, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.HandlerPc = uint16(tmp41)
	tmp42, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.CatchType = uint16(tmp42)
	return err
}
func (this *JavaClass_AttributeInfo_AttrBodyCode_ExceptionEntry) CatchException() (v *JavaClass_ConstantPoolEntry, err error) {
	if (this._f_catchException) {
		return this.catchException, nil
	}
	this._f_catchException = true
	if (this.CatchType != 0) {
		this.catchException = this._root.ConstantPool[this.CatchType - 1]
	}
	return this.catchException, nil
}

/**
 * Start of a code region where exception handler is being
 * active, index in code array (inclusive)
 */

/**
 * End of a code region where exception handler is being
 * active, index in code array (exclusive)
 */

/**
 * Start of exception handler code, index in code array
 */

/**
 * Exception class that this handler catches, index in constant
 * pool, or 0 (catch all exceptions handler, used to implement
 * `finally`).
 */

/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.5">Source</a>
 */
type JavaClass_AttributeInfo_AttrBodyExceptions struct {
	NumberOfExceptions uint16
	Exceptions []*JavaClass_AttributeInfo_AttrBodyExceptions_ExceptionTableEntry
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass_AttributeInfo
}
func NewJavaClass_AttributeInfo_AttrBodyExceptions() *JavaClass_AttributeInfo_AttrBodyExceptions {
	return &JavaClass_AttributeInfo_AttrBodyExceptions{
	}
}

func (this JavaClass_AttributeInfo_AttrBodyExceptions) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_AttributeInfo_AttrBodyExceptions) Read(io *kaitai.Stream, parent *JavaClass_AttributeInfo, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp43, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.NumberOfExceptions = uint16(tmp43)
	for i := 0; i < int(this.NumberOfExceptions); i++ {
		_ = i
		tmp44 := NewJavaClass_AttributeInfo_AttrBodyExceptions_ExceptionTableEntry()
		err = tmp44.Read(this._io, this, this._root)
		if err != nil {
			return err
		}
		this.Exceptions = append(this.Exceptions, tmp44)
	}
	return err
}
type JavaClass_AttributeInfo_AttrBodyExceptions_ExceptionTableEntry struct {
	Index uint16
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass_AttributeInfo_AttrBodyExceptions
	_f_asInfo bool
	asInfo *JavaClass_ClassCpInfo
	_f_nameAsStr bool
	nameAsStr string
}
func NewJavaClass_AttributeInfo_AttrBodyExceptions_ExceptionTableEntry() *JavaClass_AttributeInfo_AttrBodyExceptions_ExceptionTableEntry {
	return &JavaClass_AttributeInfo_AttrBodyExceptions_ExceptionTableEntry{
	}
}

func (this JavaClass_AttributeInfo_AttrBodyExceptions_ExceptionTableEntry) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_AttributeInfo_AttrBodyExceptions_ExceptionTableEntry) Read(io *kaitai.Stream, parent *JavaClass_AttributeInfo_AttrBodyExceptions, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp45, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.Index = uint16(tmp45)
	return err
}
func (this *JavaClass_AttributeInfo_AttrBodyExceptions_ExceptionTableEntry) AsInfo() (v *JavaClass_ClassCpInfo, err error) {
	if (this._f_asInfo) {
		return this.asInfo, nil
	}
	this._f_asInfo = true
	this.asInfo = this._root.ConstantPool[this.Index - 1].CpInfo.(*JavaClass_ClassCpInfo)
	return this.asInfo, nil
}
func (this *JavaClass_AttributeInfo_AttrBodyExceptions_ExceptionTableEntry) NameAsStr() (v string, err error) {
	if (this._f_nameAsStr) {
		return this.nameAsStr, nil
	}
	this._f_nameAsStr = true
	tmp46, err := this.AsInfo()
	if err != nil {
		return "", err
	}
	tmp47, err := tmp46.NameAsStr()
	if err != nil {
		return "", err
	}
	this.nameAsStr = string(tmp47)
	return this.nameAsStr, nil
}

/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.12">Source</a>
 */
type JavaClass_AttributeInfo_AttrBodyLineNumberTable struct {
	LineNumberTableLength uint16
	LineNumberTable []*JavaClass_AttributeInfo_AttrBodyLineNumberTable_LineNumberTableEntry
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass_AttributeInfo
}
func NewJavaClass_AttributeInfo_AttrBodyLineNumberTable() *JavaClass_AttributeInfo_AttrBodyLineNumberTable {
	return &JavaClass_AttributeInfo_AttrBodyLineNumberTable{
	}
}

func (this JavaClass_AttributeInfo_AttrBodyLineNumberTable) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_AttributeInfo_AttrBodyLineNumberTable) Read(io *kaitai.Stream, parent *JavaClass_AttributeInfo, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp48, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.LineNumberTableLength = uint16(tmp48)
	for i := 0; i < int(this.LineNumberTableLength); i++ {
		_ = i
		tmp49 := NewJavaClass_AttributeInfo_AttrBodyLineNumberTable_LineNumberTableEntry()
		err = tmp49.Read(this._io, this, this._root)
		if err != nil {
			return err
		}
		this.LineNumberTable = append(this.LineNumberTable, tmp49)
	}
	return err
}
type JavaClass_AttributeInfo_AttrBodyLineNumberTable_LineNumberTableEntry struct {
	StartPc uint16
	LineNumber uint16
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass_AttributeInfo_AttrBodyLineNumberTable
}
func NewJavaClass_AttributeInfo_AttrBodyLineNumberTable_LineNumberTableEntry() *JavaClass_AttributeInfo_AttrBodyLineNumberTable_LineNumberTableEntry {
	return &JavaClass_AttributeInfo_AttrBodyLineNumberTable_LineNumberTableEntry{
	}
}

func (this JavaClass_AttributeInfo_AttrBodyLineNumberTable_LineNumberTableEntry) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_AttributeInfo_AttrBodyLineNumberTable_LineNumberTableEntry) Read(io *kaitai.Stream, parent *JavaClass_AttributeInfo_AttrBodyLineNumberTable, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp50, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.StartPc = uint16(tmp50)
	tmp51, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.LineNumber = uint16(tmp51)
	return err
}

/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.10">Source</a>
 */
type JavaClass_AttributeInfo_AttrBodySourceFile struct {
	SourcefileIndex uint16
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass_AttributeInfo
	_f_sourcefileAsStr bool
	sourcefileAsStr string
}
func NewJavaClass_AttributeInfo_AttrBodySourceFile() *JavaClass_AttributeInfo_AttrBodySourceFile {
	return &JavaClass_AttributeInfo_AttrBodySourceFile{
	}
}

func (this JavaClass_AttributeInfo_AttrBodySourceFile) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_AttributeInfo_AttrBodySourceFile) Read(io *kaitai.Stream, parent *JavaClass_AttributeInfo, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp52, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.SourcefileIndex = uint16(tmp52)
	return err
}
func (this *JavaClass_AttributeInfo_AttrBodySourceFile) SourcefileAsStr() (v string, err error) {
	if (this._f_sourcefileAsStr) {
		return this.sourcefileAsStr, nil
	}
	this._f_sourcefileAsStr = true
	this.sourcefileAsStr = string(this._root.ConstantPool[this.SourcefileIndex - 1].CpInfo.(*JavaClass_Utf8CpInfo).Value)
	return this.sourcefileAsStr, nil
}

/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.1">Source</a>
 */
type JavaClass_ClassCpInfo struct {
	NameIndex uint16
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass_ConstantPoolEntry
	_f_nameAsInfo bool
	nameAsInfo *JavaClass_Utf8CpInfo
	_f_nameAsStr bool
	nameAsStr string
}
func NewJavaClass_ClassCpInfo() *JavaClass_ClassCpInfo {
	return &JavaClass_ClassCpInfo{
	}
}

func (this JavaClass_ClassCpInfo) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_ClassCpInfo) Read(io *kaitai.Stream, parent *JavaClass_ConstantPoolEntry, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp53, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.NameIndex = uint16(tmp53)
	return err
}
func (this *JavaClass_ClassCpInfo) NameAsInfo() (v *JavaClass_Utf8CpInfo, err error) {
	if (this._f_nameAsInfo) {
		return this.nameAsInfo, nil
	}
	this._f_nameAsInfo = true
	this.nameAsInfo = this._root.ConstantPool[this.NameIndex - 1].CpInfo.(*JavaClass_Utf8CpInfo)
	return this.nameAsInfo, nil
}
func (this *JavaClass_ClassCpInfo) NameAsStr() (v string, err error) {
	if (this._f_nameAsStr) {
		return this.nameAsStr, nil
	}
	this._f_nameAsStr = true
	tmp54, err := this.NameAsInfo()
	if err != nil {
		return "", err
	}
	this.nameAsStr = string(tmp54.Value)
	return this.nameAsStr, nil
}

/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4">Source</a>
 */

type JavaClass_ConstantPoolEntry_TagEnum int
const (
	JavaClass_ConstantPoolEntry_TagEnum__Utf8 JavaClass_ConstantPoolEntry_TagEnum = 1
	JavaClass_ConstantPoolEntry_TagEnum__Integer JavaClass_ConstantPoolEntry_TagEnum = 3
	JavaClass_ConstantPoolEntry_TagEnum__Float JavaClass_ConstantPoolEntry_TagEnum = 4
	JavaClass_ConstantPoolEntry_TagEnum__Long JavaClass_ConstantPoolEntry_TagEnum = 5
	JavaClass_ConstantPoolEntry_TagEnum__Double JavaClass_ConstantPoolEntry_TagEnum = 6
	JavaClass_ConstantPoolEntry_TagEnum__ClassType JavaClass_ConstantPoolEntry_TagEnum = 7
	JavaClass_ConstantPoolEntry_TagEnum__String JavaClass_ConstantPoolEntry_TagEnum = 8
	JavaClass_ConstantPoolEntry_TagEnum__FieldRef JavaClass_ConstantPoolEntry_TagEnum = 9
	JavaClass_ConstantPoolEntry_TagEnum__MethodRef JavaClass_ConstantPoolEntry_TagEnum = 10
	JavaClass_ConstantPoolEntry_TagEnum__InterfaceMethodRef JavaClass_ConstantPoolEntry_TagEnum = 11
	JavaClass_ConstantPoolEntry_TagEnum__NameAndType JavaClass_ConstantPoolEntry_TagEnum = 12
	JavaClass_ConstantPoolEntry_TagEnum__MethodHandle JavaClass_ConstantPoolEntry_TagEnum = 15
	JavaClass_ConstantPoolEntry_TagEnum__MethodType JavaClass_ConstantPoolEntry_TagEnum = 16
	JavaClass_ConstantPoolEntry_TagEnum__Dynamic JavaClass_ConstantPoolEntry_TagEnum = 17
	JavaClass_ConstantPoolEntry_TagEnum__InvokeDynamic JavaClass_ConstantPoolEntry_TagEnum = 18
	JavaClass_ConstantPoolEntry_TagEnum__Module JavaClass_ConstantPoolEntry_TagEnum = 19
	JavaClass_ConstantPoolEntry_TagEnum__Package JavaClass_ConstantPoolEntry_TagEnum = 20
)
var values_JavaClass_ConstantPoolEntry_TagEnum = map[JavaClass_ConstantPoolEntry_TagEnum]struct{}{1: {}, 3: {}, 4: {}, 5: {}, 6: {}, 7: {}, 8: {}, 9: {}, 10: {}, 11: {}, 12: {}, 15: {}, 16: {}, 17: {}, 18: {}, 19: {}, 20: {}}
func (v JavaClass_ConstantPoolEntry_TagEnum) isDefined() bool {
	_, ok := values_JavaClass_ConstantPoolEntry_TagEnum[v]
	return ok
}
type JavaClass_ConstantPoolEntry struct {
	Tag JavaClass_ConstantPoolEntry_TagEnum
	CpInfo kaitai.Struct
	IsPrevTwoEntries bool
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass
	_f_isTwoEntries bool
	isTwoEntries bool
}
func NewJavaClass_ConstantPoolEntry(isPrevTwoEntries bool) *JavaClass_ConstantPoolEntry {
	return &JavaClass_ConstantPoolEntry{
		IsPrevTwoEntries: isPrevTwoEntries,
	}
}

func (this JavaClass_ConstantPoolEntry) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_ConstantPoolEntry) Read(io *kaitai.Stream, parent *JavaClass, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	if (!(this.IsPrevTwoEntries)) {
		tmp55, err := this._io.ReadU1()
		if err != nil {
			return err
		}
		this.Tag = JavaClass_ConstantPoolEntry_TagEnum(tmp55)
	}
	if (!(this.IsPrevTwoEntries)) {
		switch (this.Tag) {
		case JavaClass_ConstantPoolEntry_TagEnum__ClassType:
			tmp56 := NewJavaClass_ClassCpInfo()
			err = tmp56.Read(this._io, this, this._root)
			if err != nil {
				return err
			}
			this.CpInfo = tmp56
		case JavaClass_ConstantPoolEntry_TagEnum__Double:
			tmp57 := NewJavaClass_DoubleCpInfo()
			err = tmp57.Read(this._io, this, this._root)
			if err != nil {
				return err
			}
			this.CpInfo = tmp57
		case JavaClass_ConstantPoolEntry_TagEnum__Dynamic:
			tmp58 := NewJavaClass_DynamicCpInfo()
			err = tmp58.Read(this._io, this, this._root)
			if err != nil {
				return err
			}
			this.CpInfo = tmp58
		case JavaClass_ConstantPoolEntry_TagEnum__FieldRef:
			tmp59 := NewJavaClass_FieldRefCpInfo()
			err = tmp59.Read(this._io, this, this._root)
			if err != nil {
				return err
			}
			this.CpInfo = tmp59
		case JavaClass_ConstantPoolEntry_TagEnum__Float:
			tmp60 := NewJavaClass_FloatCpInfo()
			err = tmp60.Read(this._io, this, this._root)
			if err != nil {
				return err
			}
			this.CpInfo = tmp60
		case JavaClass_ConstantPoolEntry_TagEnum__Integer:
			tmp61 := NewJavaClass_IntegerCpInfo()
			err = tmp61.Read(this._io, this, this._root)
			if err != nil {
				return err
			}
			this.CpInfo = tmp61
		case JavaClass_ConstantPoolEntry_TagEnum__InterfaceMethodRef:
			tmp62 := NewJavaClass_InterfaceMethodRefCpInfo()
			err = tmp62.Read(this._io, this, this._root)
			if err != nil {
				return err
			}
			this.CpInfo = tmp62
		case JavaClass_ConstantPoolEntry_TagEnum__InvokeDynamic:
			tmp63 := NewJavaClass_InvokeDynamicCpInfo()
			err = tmp63.Read(this._io, this, this._root)
			if err != nil {
				return err
			}
			this.CpInfo = tmp63
		case JavaClass_ConstantPoolEntry_TagEnum__Long:
			tmp64 := NewJavaClass_LongCpInfo()
			err = tmp64.Read(this._io, this, this._root)
			if err != nil {
				return err
			}
			this.CpInfo = tmp64
		case JavaClass_ConstantPoolEntry_TagEnum__MethodHandle:
			tmp65 := NewJavaClass_MethodHandleCpInfo()
			err = tmp65.Read(this._io, this, this._root)
			if err != nil {
				return err
			}
			this.CpInfo = tmp65
		case JavaClass_ConstantPoolEntry_TagEnum__MethodRef:
			tmp66 := NewJavaClass_MethodRefCpInfo()
			err = tmp66.Read(this._io, this, this._root)
			if err != nil {
				return err
			}
			this.CpInfo = tmp66
		case JavaClass_ConstantPoolEntry_TagEnum__MethodType:
			tmp67 := NewJavaClass_MethodTypeCpInfo()
			err = tmp67.Read(this._io, this, this._root)
			if err != nil {
				return err
			}
			this.CpInfo = tmp67
		case JavaClass_ConstantPoolEntry_TagEnum__Module:
			tmp68 := NewJavaClass_ModulePackageCpInfo()
			err = tmp68.Read(this._io, this, this._root)
			if err != nil {
				return err
			}
			this.CpInfo = tmp68
		case JavaClass_ConstantPoolEntry_TagEnum__NameAndType:
			tmp69 := NewJavaClass_NameAndTypeCpInfo()
			err = tmp69.Read(this._io, this, this._root)
			if err != nil {
				return err
			}
			this.CpInfo = tmp69
		case JavaClass_ConstantPoolEntry_TagEnum__Package:
			tmp70 := NewJavaClass_ModulePackageCpInfo()
			err = tmp70.Read(this._io, this, this._root)
			if err != nil {
				return err
			}
			this.CpInfo = tmp70
		case JavaClass_ConstantPoolEntry_TagEnum__String:
			tmp71 := NewJavaClass_StringCpInfo()
			err = tmp71.Read(this._io, this, this._root)
			if err != nil {
				return err
			}
			this.CpInfo = tmp71
		case JavaClass_ConstantPoolEntry_TagEnum__Utf8:
			tmp72 := NewJavaClass_Utf8CpInfo()
			err = tmp72.Read(this._io, this, this._root)
			if err != nil {
				return err
			}
			this.CpInfo = tmp72
		}
	}
	return err
}
func (this *JavaClass_ConstantPoolEntry) IsTwoEntries() (v bool, err error) {
	if (this._f_isTwoEntries) {
		return this.isTwoEntries, nil
	}
	this._f_isTwoEntries = true
	var tmp73 bool;
	if (this.IsPrevTwoEntries) {
		tmp73 = false
	} else {
		tmp73 =  ((this.Tag == JavaClass_ConstantPoolEntry_TagEnum__Long) || (this.Tag == JavaClass_ConstantPoolEntry_TagEnum__Double)) 
	}
	this.isTwoEntries = bool(tmp73)
	return this.isTwoEntries, nil
}

/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.6">Source</a>
 */
type JavaClass_DoubleCpInfo struct {
	Value float64
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass_ConstantPoolEntry
}
func NewJavaClass_DoubleCpInfo() *JavaClass_DoubleCpInfo {
	return &JavaClass_DoubleCpInfo{
	}
}

func (this JavaClass_DoubleCpInfo) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_DoubleCpInfo) Read(io *kaitai.Stream, parent *JavaClass_ConstantPoolEntry, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp74, err := this._io.ReadF8be()
	if err != nil {
		return err
	}
	this.Value = float64(tmp74)
	return err
}

/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se19/html/jvms-4.html#jvms-4.4.10">Source</a>
 */
type JavaClass_DynamicCpInfo struct {
	_unnamed0 *JavaClass_VersionGuard
	BootstrapMethodAttrIndex uint16
	NameAndTypeIndex uint16
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass_ConstantPoolEntry
}
func NewJavaClass_DynamicCpInfo() *JavaClass_DynamicCpInfo {
	return &JavaClass_DynamicCpInfo{
	}
}

func (this JavaClass_DynamicCpInfo) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_DynamicCpInfo) Read(io *kaitai.Stream, parent *JavaClass_ConstantPoolEntry, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp75 := NewJavaClass_VersionGuard(55)
	err = tmp75.Read(this._io, this, this._root)
	if err != nil {
		return err
	}
	this._unnamed0 = tmp75
	tmp76, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.BootstrapMethodAttrIndex = uint16(tmp76)
	tmp77, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.NameAndTypeIndex = uint16(tmp77)
	return err
}

/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.5">Source</a>
 */
type JavaClass_FieldInfo struct {
	AccessFlags uint16
	NameIndex uint16
	DescriptorIndex uint16
	AttributesCount uint16
	Attributes []*JavaClass_AttributeInfo
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass
	_f_nameAsStr bool
	nameAsStr string
}
func NewJavaClass_FieldInfo() *JavaClass_FieldInfo {
	return &JavaClass_FieldInfo{
	}
}

func (this JavaClass_FieldInfo) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_FieldInfo) Read(io *kaitai.Stream, parent *JavaClass, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp78, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.AccessFlags = uint16(tmp78)
	tmp79, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.NameIndex = uint16(tmp79)
	tmp80, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.DescriptorIndex = uint16(tmp80)
	tmp81, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.AttributesCount = uint16(tmp81)
	for i := 0; i < int(this.AttributesCount); i++ {
		_ = i
		tmp82 := NewJavaClass_AttributeInfo()
		err = tmp82.Read(this._io, this, this._root)
		if err != nil {
			return err
		}
		this.Attributes = append(this.Attributes, tmp82)
	}
	return err
}
func (this *JavaClass_FieldInfo) NameAsStr() (v string, err error) {
	if (this._f_nameAsStr) {
		return this.nameAsStr, nil
	}
	this._f_nameAsStr = true
	this.nameAsStr = string(this._root.ConstantPool[this.NameIndex - 1].CpInfo.(*JavaClass_Utf8CpInfo).Value)
	return this.nameAsStr, nil
}

/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.2">Source</a>
 */
type JavaClass_FieldRefCpInfo struct {
	ClassIndex uint16
	NameAndTypeIndex uint16
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass_ConstantPoolEntry
	_f_classAsInfo bool
	classAsInfo *JavaClass_ClassCpInfo
	_f_nameAndTypeAsInfo bool
	nameAndTypeAsInfo *JavaClass_NameAndTypeCpInfo
}
func NewJavaClass_FieldRefCpInfo() *JavaClass_FieldRefCpInfo {
	return &JavaClass_FieldRefCpInfo{
	}
}

func (this JavaClass_FieldRefCpInfo) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_FieldRefCpInfo) Read(io *kaitai.Stream, parent *JavaClass_ConstantPoolEntry, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp83, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.ClassIndex = uint16(tmp83)
	tmp84, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.NameAndTypeIndex = uint16(tmp84)
	return err
}
func (this *JavaClass_FieldRefCpInfo) ClassAsInfo() (v *JavaClass_ClassCpInfo, err error) {
	if (this._f_classAsInfo) {
		return this.classAsInfo, nil
	}
	this._f_classAsInfo = true
	this.classAsInfo = this._root.ConstantPool[this.ClassIndex - 1].CpInfo.(*JavaClass_ClassCpInfo)
	return this.classAsInfo, nil
}
func (this *JavaClass_FieldRefCpInfo) NameAndTypeAsInfo() (v *JavaClass_NameAndTypeCpInfo, err error) {
	if (this._f_nameAndTypeAsInfo) {
		return this.nameAndTypeAsInfo, nil
	}
	this._f_nameAndTypeAsInfo = true
	this.nameAndTypeAsInfo = this._root.ConstantPool[this.NameAndTypeIndex - 1].CpInfo.(*JavaClass_NameAndTypeCpInfo)
	return this.nameAndTypeAsInfo, nil
}

/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.5">Source</a>
 */
type JavaClass_FloatCpInfo struct {
	Value float32
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass_ConstantPoolEntry
}
func NewJavaClass_FloatCpInfo() *JavaClass_FloatCpInfo {
	return &JavaClass_FloatCpInfo{
	}
}

func (this JavaClass_FloatCpInfo) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_FloatCpInfo) Read(io *kaitai.Stream, parent *JavaClass_ConstantPoolEntry, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp85, err := this._io.ReadF4be()
	if err != nil {
		return err
	}
	this.Value = float32(tmp85)
	return err
}

/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.4">Source</a>
 */
type JavaClass_IntegerCpInfo struct {
	Value uint32
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass_ConstantPoolEntry
}
func NewJavaClass_IntegerCpInfo() *JavaClass_IntegerCpInfo {
	return &JavaClass_IntegerCpInfo{
	}
}

func (this JavaClass_IntegerCpInfo) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_IntegerCpInfo) Read(io *kaitai.Stream, parent *JavaClass_ConstantPoolEntry, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp86, err := this._io.ReadU4be()
	if err != nil {
		return err
	}
	this.Value = uint32(tmp86)
	return err
}

/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.2">Source</a>
 */
type JavaClass_InterfaceMethodRefCpInfo struct {
	ClassIndex uint16
	NameAndTypeIndex uint16
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass_ConstantPoolEntry
	_f_classAsInfo bool
	classAsInfo *JavaClass_ClassCpInfo
	_f_nameAndTypeAsInfo bool
	nameAndTypeAsInfo *JavaClass_NameAndTypeCpInfo
}
func NewJavaClass_InterfaceMethodRefCpInfo() *JavaClass_InterfaceMethodRefCpInfo {
	return &JavaClass_InterfaceMethodRefCpInfo{
	}
}

func (this JavaClass_InterfaceMethodRefCpInfo) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_InterfaceMethodRefCpInfo) Read(io *kaitai.Stream, parent *JavaClass_ConstantPoolEntry, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp87, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.ClassIndex = uint16(tmp87)
	tmp88, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.NameAndTypeIndex = uint16(tmp88)
	return err
}
func (this *JavaClass_InterfaceMethodRefCpInfo) ClassAsInfo() (v *JavaClass_ClassCpInfo, err error) {
	if (this._f_classAsInfo) {
		return this.classAsInfo, nil
	}
	this._f_classAsInfo = true
	this.classAsInfo = this._root.ConstantPool[this.ClassIndex - 1].CpInfo.(*JavaClass_ClassCpInfo)
	return this.classAsInfo, nil
}
func (this *JavaClass_InterfaceMethodRefCpInfo) NameAndTypeAsInfo() (v *JavaClass_NameAndTypeCpInfo, err error) {
	if (this._f_nameAndTypeAsInfo) {
		return this.nameAndTypeAsInfo, nil
	}
	this._f_nameAndTypeAsInfo = true
	this.nameAndTypeAsInfo = this._root.ConstantPool[this.NameAndTypeIndex - 1].CpInfo.(*JavaClass_NameAndTypeCpInfo)
	return this.nameAndTypeAsInfo, nil
}

/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.10">Source</a>
 */
type JavaClass_InvokeDynamicCpInfo struct {
	_unnamed0 *JavaClass_VersionGuard
	BootstrapMethodAttrIndex uint16
	NameAndTypeIndex uint16
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass_ConstantPoolEntry
}
func NewJavaClass_InvokeDynamicCpInfo() *JavaClass_InvokeDynamicCpInfo {
	return &JavaClass_InvokeDynamicCpInfo{
	}
}

func (this JavaClass_InvokeDynamicCpInfo) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_InvokeDynamicCpInfo) Read(io *kaitai.Stream, parent *JavaClass_ConstantPoolEntry, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp89 := NewJavaClass_VersionGuard(51)
	err = tmp89.Read(this._io, this, this._root)
	if err != nil {
		return err
	}
	this._unnamed0 = tmp89
	tmp90, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.BootstrapMethodAttrIndex = uint16(tmp90)
	tmp91, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.NameAndTypeIndex = uint16(tmp91)
	return err
}

/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.5">Source</a>
 */
type JavaClass_LongCpInfo struct {
	Value uint64
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass_ConstantPoolEntry
}
func NewJavaClass_LongCpInfo() *JavaClass_LongCpInfo {
	return &JavaClass_LongCpInfo{
	}
}

func (this JavaClass_LongCpInfo) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_LongCpInfo) Read(io *kaitai.Stream, parent *JavaClass_ConstantPoolEntry, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp92, err := this._io.ReadU8be()
	if err != nil {
		return err
	}
	this.Value = uint64(tmp92)
	return err
}

/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.8">Source</a>
 */

type JavaClass_MethodHandleCpInfo_ReferenceKindEnum int
const (
	JavaClass_MethodHandleCpInfo_ReferenceKindEnum__GetField JavaClass_MethodHandleCpInfo_ReferenceKindEnum = 1
	JavaClass_MethodHandleCpInfo_ReferenceKindEnum__GetStatic JavaClass_MethodHandleCpInfo_ReferenceKindEnum = 2
	JavaClass_MethodHandleCpInfo_ReferenceKindEnum__PutField JavaClass_MethodHandleCpInfo_ReferenceKindEnum = 3
	JavaClass_MethodHandleCpInfo_ReferenceKindEnum__PutStatic JavaClass_MethodHandleCpInfo_ReferenceKindEnum = 4
	JavaClass_MethodHandleCpInfo_ReferenceKindEnum__InvokeVirtual JavaClass_MethodHandleCpInfo_ReferenceKindEnum = 5
	JavaClass_MethodHandleCpInfo_ReferenceKindEnum__InvokeStatic JavaClass_MethodHandleCpInfo_ReferenceKindEnum = 6
	JavaClass_MethodHandleCpInfo_ReferenceKindEnum__InvokeSpecial JavaClass_MethodHandleCpInfo_ReferenceKindEnum = 7
	JavaClass_MethodHandleCpInfo_ReferenceKindEnum__NewInvokeSpecial JavaClass_MethodHandleCpInfo_ReferenceKindEnum = 8
	JavaClass_MethodHandleCpInfo_ReferenceKindEnum__InvokeInterface JavaClass_MethodHandleCpInfo_ReferenceKindEnum = 9
)
var values_JavaClass_MethodHandleCpInfo_ReferenceKindEnum = map[JavaClass_MethodHandleCpInfo_ReferenceKindEnum]struct{}{1: {}, 2: {}, 3: {}, 4: {}, 5: {}, 6: {}, 7: {}, 8: {}, 9: {}}
func (v JavaClass_MethodHandleCpInfo_ReferenceKindEnum) isDefined() bool {
	_, ok := values_JavaClass_MethodHandleCpInfo_ReferenceKindEnum[v]
	return ok
}
type JavaClass_MethodHandleCpInfo struct {
	_unnamed0 *JavaClass_VersionGuard
	ReferenceKind JavaClass_MethodHandleCpInfo_ReferenceKindEnum
	ReferenceIndex uint16
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass_ConstantPoolEntry
}
func NewJavaClass_MethodHandleCpInfo() *JavaClass_MethodHandleCpInfo {
	return &JavaClass_MethodHandleCpInfo{
	}
}

func (this JavaClass_MethodHandleCpInfo) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_MethodHandleCpInfo) Read(io *kaitai.Stream, parent *JavaClass_ConstantPoolEntry, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp93 := NewJavaClass_VersionGuard(51)
	err = tmp93.Read(this._io, this, this._root)
	if err != nil {
		return err
	}
	this._unnamed0 = tmp93
	tmp94, err := this._io.ReadU1()
	if err != nil {
		return err
	}
	this.ReferenceKind = JavaClass_MethodHandleCpInfo_ReferenceKindEnum(tmp94)
	tmp95, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.ReferenceIndex = uint16(tmp95)
	return err
}

/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.6">Source</a>
 */
type JavaClass_MethodInfo struct {
	AccessFlags uint16
	NameIndex uint16
	DescriptorIndex uint16
	AttributesCount uint16
	Attributes []*JavaClass_AttributeInfo
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass
	_f_nameAsStr bool
	nameAsStr string
}
func NewJavaClass_MethodInfo() *JavaClass_MethodInfo {
	return &JavaClass_MethodInfo{
	}
}

func (this JavaClass_MethodInfo) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_MethodInfo) Read(io *kaitai.Stream, parent *JavaClass, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp96, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.AccessFlags = uint16(tmp96)
	tmp97, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.NameIndex = uint16(tmp97)
	tmp98, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.DescriptorIndex = uint16(tmp98)
	tmp99, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.AttributesCount = uint16(tmp99)
	for i := 0; i < int(this.AttributesCount); i++ {
		_ = i
		tmp100 := NewJavaClass_AttributeInfo()
		err = tmp100.Read(this._io, this, this._root)
		if err != nil {
			return err
		}
		this.Attributes = append(this.Attributes, tmp100)
	}
	return err
}
func (this *JavaClass_MethodInfo) NameAsStr() (v string, err error) {
	if (this._f_nameAsStr) {
		return this.nameAsStr, nil
	}
	this._f_nameAsStr = true
	this.nameAsStr = string(this._root.ConstantPool[this.NameIndex - 1].CpInfo.(*JavaClass_Utf8CpInfo).Value)
	return this.nameAsStr, nil
}

/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.2">Source</a>
 */
type JavaClass_MethodRefCpInfo struct {
	ClassIndex uint16
	NameAndTypeIndex uint16
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass_ConstantPoolEntry
	_f_classAsInfo bool
	classAsInfo *JavaClass_ClassCpInfo
	_f_nameAndTypeAsInfo bool
	nameAndTypeAsInfo *JavaClass_NameAndTypeCpInfo
}
func NewJavaClass_MethodRefCpInfo() *JavaClass_MethodRefCpInfo {
	return &JavaClass_MethodRefCpInfo{
	}
}

func (this JavaClass_MethodRefCpInfo) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_MethodRefCpInfo) Read(io *kaitai.Stream, parent *JavaClass_ConstantPoolEntry, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp101, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.ClassIndex = uint16(tmp101)
	tmp102, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.NameAndTypeIndex = uint16(tmp102)
	return err
}
func (this *JavaClass_MethodRefCpInfo) ClassAsInfo() (v *JavaClass_ClassCpInfo, err error) {
	if (this._f_classAsInfo) {
		return this.classAsInfo, nil
	}
	this._f_classAsInfo = true
	this.classAsInfo = this._root.ConstantPool[this.ClassIndex - 1].CpInfo.(*JavaClass_ClassCpInfo)
	return this.classAsInfo, nil
}
func (this *JavaClass_MethodRefCpInfo) NameAndTypeAsInfo() (v *JavaClass_NameAndTypeCpInfo, err error) {
	if (this._f_nameAndTypeAsInfo) {
		return this.nameAndTypeAsInfo, nil
	}
	this._f_nameAndTypeAsInfo = true
	this.nameAndTypeAsInfo = this._root.ConstantPool[this.NameAndTypeIndex - 1].CpInfo.(*JavaClass_NameAndTypeCpInfo)
	return this.nameAndTypeAsInfo, nil
}

/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.9">Source</a>
 */
type JavaClass_MethodTypeCpInfo struct {
	_unnamed0 *JavaClass_VersionGuard
	DescriptorIndex uint16
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass_ConstantPoolEntry
}
func NewJavaClass_MethodTypeCpInfo() *JavaClass_MethodTypeCpInfo {
	return &JavaClass_MethodTypeCpInfo{
	}
}

func (this JavaClass_MethodTypeCpInfo) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_MethodTypeCpInfo) Read(io *kaitai.Stream, parent *JavaClass_ConstantPoolEntry, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp103 := NewJavaClass_VersionGuard(51)
	err = tmp103.Read(this._io, this, this._root)
	if err != nil {
		return err
	}
	this._unnamed0 = tmp103
	tmp104, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.DescriptorIndex = uint16(tmp104)
	return err
}

/**
 * Project Jigsaw modules introduced in Java 9
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se19/html/jvms-3.html#jvms-3.16">Source</a>
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se19/html/jvms-4.html#jvms-4.4.11">Source</a>
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se19/html/jvms-4.html#jvms-4.4.12">Source</a>
 */
type JavaClass_ModulePackageCpInfo struct {
	_unnamed0 *JavaClass_VersionGuard
	NameIndex uint16
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass_ConstantPoolEntry
	_f_nameAsInfo bool
	nameAsInfo *JavaClass_Utf8CpInfo
	_f_nameAsStr bool
	nameAsStr string
}
func NewJavaClass_ModulePackageCpInfo() *JavaClass_ModulePackageCpInfo {
	return &JavaClass_ModulePackageCpInfo{
	}
}

func (this JavaClass_ModulePackageCpInfo) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_ModulePackageCpInfo) Read(io *kaitai.Stream, parent *JavaClass_ConstantPoolEntry, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp105 := NewJavaClass_VersionGuard(53)
	err = tmp105.Read(this._io, this, this._root)
	if err != nil {
		return err
	}
	this._unnamed0 = tmp105
	tmp106, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.NameIndex = uint16(tmp106)
	return err
}
func (this *JavaClass_ModulePackageCpInfo) NameAsInfo() (v *JavaClass_Utf8CpInfo, err error) {
	if (this._f_nameAsInfo) {
		return this.nameAsInfo, nil
	}
	this._f_nameAsInfo = true
	this.nameAsInfo = this._root.ConstantPool[this.NameIndex - 1].CpInfo.(*JavaClass_Utf8CpInfo)
	return this.nameAsInfo, nil
}
func (this *JavaClass_ModulePackageCpInfo) NameAsStr() (v string, err error) {
	if (this._f_nameAsStr) {
		return this.nameAsStr, nil
	}
	this._f_nameAsStr = true
	tmp107, err := this.NameAsInfo()
	if err != nil {
		return "", err
	}
	this.nameAsStr = string(tmp107.Value)
	return this.nameAsStr, nil
}

/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.6">Source</a>
 */
type JavaClass_NameAndTypeCpInfo struct {
	NameIndex uint16
	DescriptorIndex uint16
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass_ConstantPoolEntry
	_f_descriptorAsInfo bool
	descriptorAsInfo *JavaClass_Utf8CpInfo
	_f_descriptorAsStr bool
	descriptorAsStr string
	_f_nameAsInfo bool
	nameAsInfo *JavaClass_Utf8CpInfo
	_f_nameAsStr bool
	nameAsStr string
}
func NewJavaClass_NameAndTypeCpInfo() *JavaClass_NameAndTypeCpInfo {
	return &JavaClass_NameAndTypeCpInfo{
	}
}

func (this JavaClass_NameAndTypeCpInfo) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_NameAndTypeCpInfo) Read(io *kaitai.Stream, parent *JavaClass_ConstantPoolEntry, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp108, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.NameIndex = uint16(tmp108)
	tmp109, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.DescriptorIndex = uint16(tmp109)
	return err
}
func (this *JavaClass_NameAndTypeCpInfo) DescriptorAsInfo() (v *JavaClass_Utf8CpInfo, err error) {
	if (this._f_descriptorAsInfo) {
		return this.descriptorAsInfo, nil
	}
	this._f_descriptorAsInfo = true
	this.descriptorAsInfo = this._root.ConstantPool[this.DescriptorIndex - 1].CpInfo.(*JavaClass_Utf8CpInfo)
	return this.descriptorAsInfo, nil
}
func (this *JavaClass_NameAndTypeCpInfo) DescriptorAsStr() (v string, err error) {
	if (this._f_descriptorAsStr) {
		return this.descriptorAsStr, nil
	}
	this._f_descriptorAsStr = true
	tmp110, err := this.DescriptorAsInfo()
	if err != nil {
		return "", err
	}
	this.descriptorAsStr = string(tmp110.Value)
	return this.descriptorAsStr, nil
}
func (this *JavaClass_NameAndTypeCpInfo) NameAsInfo() (v *JavaClass_Utf8CpInfo, err error) {
	if (this._f_nameAsInfo) {
		return this.nameAsInfo, nil
	}
	this._f_nameAsInfo = true
	this.nameAsInfo = this._root.ConstantPool[this.NameIndex - 1].CpInfo.(*JavaClass_Utf8CpInfo)
	return this.nameAsInfo, nil
}
func (this *JavaClass_NameAndTypeCpInfo) NameAsStr() (v string, err error) {
	if (this._f_nameAsStr) {
		return this.nameAsStr, nil
	}
	this._f_nameAsStr = true
	tmp111, err := this.NameAsInfo()
	if err != nil {
		return "", err
	}
	this.nameAsStr = string(tmp111.Value)
	return this.nameAsStr, nil
}

/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.3">Source</a>
 */
type JavaClass_StringCpInfo struct {
	StringIndex uint16
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass_ConstantPoolEntry
}
func NewJavaClass_StringCpInfo() *JavaClass_StringCpInfo {
	return &JavaClass_StringCpInfo{
	}
}

func (this JavaClass_StringCpInfo) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_StringCpInfo) Read(io *kaitai.Stream, parent *JavaClass_ConstantPoolEntry, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp112, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.StringIndex = uint16(tmp112)
	return err
}

/**
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.7">Source</a>
 */
type JavaClass_Utf8CpInfo struct {
	StrLen uint16
	Value string
	_io *kaitai.Stream
	_root *JavaClass
	_parent *JavaClass_ConstantPoolEntry
}
func NewJavaClass_Utf8CpInfo() *JavaClass_Utf8CpInfo {
	return &JavaClass_Utf8CpInfo{
	}
}

func (this JavaClass_Utf8CpInfo) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_Utf8CpInfo) Read(io *kaitai.Stream, parent *JavaClass_ConstantPoolEntry, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp113, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.StrLen = uint16(tmp113)
	tmp114, err := this._io.ReadBytes(int(this.StrLen))
	if err != nil {
		return err
	}
	tmp114 = tmp114
	this.Value = string(tmp114)
	return err
}

/**
 * `class` file format version 45.3 (appeared in the very first publicly
 * known release of Java SE AND JDK 1.0.2, released 23th January 1996) is so
 * ancient that it's taken for granted. Earlier formats seem to be
 * undocumented. Changes of `version_minor` don't change `class` format.
 * Earlier `version_major`s likely belong to Oak programming language, the
 * proprietary predecessor of Java.
 * @see "James Gosling, Bill Joy and Guy Steele. The Java Language Specification. English. Ed. by Lisa Friendly. Addison-Wesley, Aug. 1996, p. 825. ISBN: 0-201-63451-1."
 * @see "Frank Yellin and Tim Lindholm. The Java Virtual Machine Specification. English. Ed. by Lisa Friendly. Addison-Wesley, Sept. 1996, p. 475. ISBN: 0-201-63452-X."
 */
type JavaClass_VersionGuard struct {
	_unnamed0 []byte
	Major uint16
	_io *kaitai.Stream
	_root *JavaClass
	_parent kaitai.Struct
}
func NewJavaClass_VersionGuard(major uint16) *JavaClass_VersionGuard {
	return &JavaClass_VersionGuard{
		Major: major,
	}
}

func (this JavaClass_VersionGuard) IO_() *kaitai.Stream {
	return this._io
}

func (this *JavaClass_VersionGuard) Read(io *kaitai.Stream, parent kaitai.Struct, root *JavaClass) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp115, err := this._io.ReadBytes(int(0))
	if err != nil {
		return err
	}
	tmp115 = tmp115
	this._unnamed0 = tmp115
	{
		_it := this._unnamed0
		if !(this._root.VersionMajor >= this.Major) {
			return kaitai.NewValidationExprError(this._unnamed0, this._io, "/types/version_guard/seq/0")
		}
	}
	return err
}