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.
// 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
}