public class ClassFile extends BinaryClassSource
Modifier and Type | Class and Description |
---|---|
static class |
ClassFile.CpInfo |
BinaryClassSource.BigEndianReader, BinaryClassSource.ByteReader, BinaryClassSource.LittleEndianReader
byteReader, data, pc, pos, posStack, top
Constructor and Description |
---|
ClassFile(byte[] data) |
ClassFile(byte[] data,
int offset) |
ClassFile(java.io.File file) |
ClassFile(java.lang.String pathName) |
ClassFile(java.lang.String typeName,
byte[] data) |
ClassFile(java.lang.String typeName,
byte[] data,
int offset) |
Modifier and Type | Method and Description |
---|---|
int |
bootstrapMethodIndex(int cpInvokeDynamicIndex) |
java.lang.String |
callSiteDescriptor(int cpInvokeDynamicIndex) |
java.lang.String |
classNameAt(int classInfoIdx) |
double |
doubleAt(int doubleInfoIdx) |
java.lang.String |
fieldClassNameAt(int fieldRefInfoIdx) |
java.lang.String |
fieldDescriptorAt(int fieldRefInfoIdx) |
java.lang.String |
fieldNameAt(int fieldRefInfoIdx) |
float |
floatAt(int floatInfoIdx) |
java.lang.Object |
getConstValueAttribute(int dataPos) |
int |
getCpTag(int i) |
java.lang.Object |
getCpValue(int i) |
int |
getDataPosOfCpEntry(int i)
the result can be used as input for u2(dataIndex)
NOTE - this returns -1 for the dreaded unused extra entries associated
with ConstantDouble and ConstantLong
|
int |
getLookupSwitchOffset(int nEntries,
int defaultOffset,
int val) |
int |
getNumberOfCpEntries() |
int |
getPc() |
int |
getPos() |
java.lang.String |
getRefTypeName(int refCode) |
java.lang.String |
getRequestedTypeName()
return the typename this classfile gets loaded for
<2do> this is going away
|
static java.lang.String |
getScopeEncoding(long[] scopeEntries) |
java.lang.String |
getSourceFileAttribute(int dataPos) |
int |
getTableSwitchOffset(int low,
int high,
int defaultOffset,
int val) |
static java.lang.String |
getTargetTypeName(int targetType) |
java.lang.String |
getTypeName(int typeCode) |
static java.lang.String |
getTypePathEncoding(short[] typePath) |
int |
i1(int dataIdx) |
int |
i2(int dataIdx) |
int |
intAt(int intInfoIdx) |
java.lang.String |
interfaceMethodClassNameAt(int ifcMethodRefInfoIdx) |
java.lang.String |
interfaceMethodDescriptorAt(int ifcMethodRefInfoIdx) |
java.lang.String |
interfaceMethodNameAt(int ifcMethodRefInfoIdx) |
protected java.lang.String |
internStdAttrName(int cpIdx,
java.lang.String name,
java.lang.String[] stdNames) |
long |
longAt(int longInfoIdx) |
java.lang.String |
methodClassNameAt(int methodRefInfoIdx) |
java.lang.String |
methodDescriptorAt(int methodRefInfoIdx) |
java.lang.String |
methodNameAt(int methodRefInfoIdx) |
java.lang.String |
methodTypeDescriptorAt(int methodTypeInfoIdx) |
int |
mhMethodRefIndexAt(int methodHandleInfoIdx) |
int |
mhRefTypeAt(int methodHandleInfoIdx) |
void |
parse(ClassFileReader reader)
this is the main parsing routine that uses the ClassFileReader interface
to tell clients about the classfile contents
ClassFile structure: http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html#74353
u4 magic; // 0xcafebabe
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_entry constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
|
void |
parseAnnotationDefaultAttr(ClassFileReader reader,
java.lang.Object tag)
AnnotationDefault_attribute {
u2 attribute_name_index;
u4 attribute_length;
element_value default_value; << pos
}
|
void |
parseAnnotationsAttr(ClassFileReader reader,
java.lang.Object tag) |
void |
parseBootstrapMethodAttr(ClassFileReader reader,
java.lang.Object tag)
BootstrapMethods_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 num_bootstrap_methods;
{ u2 bootstrap_method_ref; -> MethodHandle
u2 num_bootstrap_arguments;
u2 bootstrap_arguments[num_bootstrap_arguments];
} bootstrap_methods[num_bootstrap_methods];
}
pos is at num_bootstrap_methods
|
void |
parseBytecode(JVMByteCodeReader reader,
java.lang.Object tag,
int codeLength) |
protected void |
parseClassAttributes(ClassFileReader reader,
int attrCount) |
void |
parseCodeAttr(ClassFileReader reader,
java.lang.Object tag)
(optionally) called by reader from within the setMethodAttribute() notification
This means we have recursive notification since this is a variable length
attribute that has variable length attributes
Code_attribute { u2 attr_name_index
|
protected void |
parseCodeAttrAttributes(ClassFileReader reader,
java.lang.Object tag,
int attrCount) |
void |
parseConstValueAttr(ClassFileReader reader,
java.lang.Object tag)
optionally called by reader to obtain a ConstantValue field attribute
ConstantValue {u2 attrName
|
protected void |
parseCp(int cpCount) |
void |
parseEnclosingMethodAttr(ClassFileReader reader,
java.lang.Object tag)
EnclosingMethod_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 class_index -> Class_info { u1 tag; u2 name_index->utf8 }
u2 method_index -> NameAndType_info { u1 tag; u2 name_index->utf8; u2 descriptor_index->utf8 }
}
|
void |
parseExceptionAttr(ClassFileReader reader,
java.lang.Object tag) |
protected void |
parseFieldAttributes(ClassFileReader reader,
int fieldIdx,
int attrCount) |
protected void |
parseFields(ClassFileReader reader,
int fieldCount) |
void |
parseInnerClassesAttr(ClassFileReader reader,
java.lang.Object tag)
(optionally) called by ClassFileReader from within setClassAttribute() notification
InnerClass {
u2 nameIdx
|
protected void |
parseInterfaces(ClassFileReader reader,
int ifcCount) |
void |
parseLineNumberTableAttr(ClassFileReader reader,
java.lang.Object tag)
optionally called from ClassFileReader.setCodeAttribute() to parse LineNumberTables
LineNumberTable { u2 attrName; u4 attrLength;
u2 lineCount;
{ u2 startPc; u2 lineNumber; } [lineCount] };
pos is at lineCount
|
void |
parseLocalVarTableAttr(ClassFileReader reader,
java.lang.Object tag)
optionally called from ClassFileReader.setCodeAttribute() to parse LocalVarTables
LocalVarTableTable { u2 attrName; u4 attrLength;
u2 localVarCount;
{ u2 startPc; u2 lineNumber; } [lineCount] };
pos is at localVarCount
|
void |
parseLookupSwitchEntries(JVMByteCodeReader reader,
int nEntries) |
protected void |
parseMethodAttributes(ClassFileReader reader,
int methodIdx,
int attrCount) |
protected void |
parseMethods(ClassFileReader reader,
int methodCount) |
void |
parseParameterAnnotationsAttr(ClassFileReader reader,
java.lang.Object tag) |
void |
parseSignatureAttr(ClassFileReader reader,
java.lang.Object tag)
Signature_attribute {
u2 attribute_name_index;
u4 attr-length;
u2 signature-index << pos
}
|
void |
parseSourceFileAttr(ClassFileReader reader,
java.lang.Object tag)
(optionally) called by ClassFileReader from within setClassAttribute() notification
InnerClass { u2 nameIdx
|
void |
parseTableSwitchEntries(JVMByteCodeReader reader,
int low,
int high) |
void |
parseTypeAnnotationsAttr(ClassFileReader reader,
java.lang.Object tag) |
int |
readI2() |
int |
readI4() |
static java.lang.String |
readModifiedUTF8String(byte[] data,
int pos,
int len) |
int |
readU2() |
java.lang.String |
refClassNameAt(int cpIdx) |
java.lang.String |
refDescriptorAt(int cpIdx) |
java.lang.String |
refNameAt(int cpIdx) |
java.lang.String |
samMethodNameAt(int cpInvokeDynamicIndex) |
void |
setAnnotationValuesDone(ClassFileReader reader,
java.lang.Object tag,
int annotationIndex) |
void |
setData(byte[] newData)
set classfile data.
|
void |
setSignature(ClassFileReader reader,
java.lang.Object tag,
java.lang.String signature) |
java.lang.String |
stringAt(int stringInfoIdx) |
int |
u1(int dataIdx) |
int |
u2(int dataIdx) |
java.lang.String |
utf8At(int utf8InfoIdx) |
dataToString, dumpData, error, getData, hasMoreData, initializeByteReader, popPos, pushPos, read, readByte, readByteString, readData, readUByte, setPos, stopParsing
public static final int CONSTANT_UTF8
public static final int CONSTANT_INTEGER
public static final int CONSTANT_FLOAT
public static final int CONSTANT_LONG
public static final int CONSTANT_DOUBLE
public static final int CONSTANT_CLASS
public static final int CONSTANT_STRING
public static final int FIELD_REF
public static final int METHOD_REF
public static final int INTERFACE_METHOD_REF
public static final int NAME_AND_TYPE
public static final int METHOD_HANDLE
public static final int METHOD_TYPE
public static final int INVOKE_DYNAMIC
public static final int REF_GETFIELD
public static final int REF_GETSTATIC
public static final int REF_PUTFIELD
public static final int REF_PUTSTATIC
public static final int REF_INVOKEVIRTUAL
public static final int REF_INVOKESTATIC
public static final int REF_INVOKESPECIAL
public static final int REF_NEW_INVOKESPECIAL
public static final int REF_INVOKEINTERFACE
public static final java.lang.String SYNTHETIC_ATTR
public static final java.lang.String DEPRECATED_ATTR
public static final java.lang.String SIGNATURE_ATTR
public static final java.lang.String RUNTIME_INVISIBLE_ANNOTATIONS_ATTR
public static final java.lang.String RUNTIME_VISIBLE_ANNOTATIONS_ATTR
public static final java.lang.String RUNTIME_VISIBLE_TYPE_ANNOTATIONS_ATTR
public static final java.lang.String CONST_VALUE_ATTR
protected static final java.lang.String[] stdFieldAttrs
public static final java.lang.String CODE_ATTR
public static final java.lang.String EXCEPTIONS_ATTR
public static final java.lang.String RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS_ATTR
public static final java.lang.String RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS_ATTR
public static final java.lang.String ANNOTATIONDEFAULT_ATTR
protected static final java.lang.String[] stdMethodAttrs
public static final java.lang.String LINE_NUMBER_TABLE_ATTR
public static final java.lang.String LOCAL_VAR_TABLE_ATTR
protected static final java.lang.String[] stdCodeAttrs
public static final java.lang.String SOURCE_FILE_ATTR
public static final java.lang.String INNER_CLASSES_ATTR
public static final java.lang.String ENCLOSING_METHOD_ATTR
public static final java.lang.String BOOTSTRAP_METHOD_ATTR
protected static final java.lang.String[] stdClassAttrs
public static final int CLASS_TYPE_PARAMETER
public static final int METHOD_TYPE_PARAMETER
public static final int CLASS_EXTENDS
public static final int CLASS_TYPE_PARAMETER_BOUND
public static final int METHOD_TYPE_PARAMETER_BOUND
public static final int FIELD
public static final int METHOD_RETURN
public static final int METHOD_RECEIVER
public static final int METHOD_FORMAL_PARAMETER
public static final int THROWS
public static final int LOCAL_VARIABLE
public static final int RESOURCE_VARIABLE
public static final int EXCEPTION_PARAMETER
public static final int INSTANCEOF
public static final int NEW
public static final int CONSTRUCTOR_REFERENCE
public static final int METHOD_REFERENCE
public static final int CAST
public static final int CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT
public static final int METHOD_INVOCATION_TYPE_ARGUMENT
public static final int CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT
public static final int METHOD_REFERENCE_TYPE_ARGUMENT
public ClassFile(byte[] data, int offset)
public ClassFile(byte[] data)
public ClassFile(java.lang.String typeName, byte[] data)
public ClassFile(java.lang.String typeName, byte[] data, int offset)
public ClassFile(java.io.File file) throws ClassParseException
ClassParseException
public ClassFile(java.lang.String pathName) throws ClassParseException
ClassParseException
public void setData(byte[] newData)
public java.lang.String getRequestedTypeName()
protected java.lang.String internStdAttrName(int cpIdx, java.lang.String name, java.lang.String[] stdNames)
public java.lang.String utf8At(int utf8InfoIdx)
public int intAt(int intInfoIdx)
public float floatAt(int floatInfoIdx)
public long longAt(int longInfoIdx)
public double doubleAt(int doubleInfoIdx)
public java.lang.String classNameAt(int classInfoIdx)
public java.lang.String stringAt(int stringInfoIdx)
public java.lang.String refClassNameAt(int cpIdx)
public java.lang.String refNameAt(int cpIdx)
public java.lang.String refDescriptorAt(int cpIdx)
public int mhRefTypeAt(int methodHandleInfoIdx)
public int mhMethodRefIndexAt(int methodHandleInfoIdx)
public java.lang.String fieldClassNameAt(int fieldRefInfoIdx)
public java.lang.String fieldNameAt(int fieldRefInfoIdx)
public java.lang.String fieldDescriptorAt(int fieldRefInfoIdx)
public java.lang.String methodClassNameAt(int methodRefInfoIdx)
public java.lang.String methodNameAt(int methodRefInfoIdx)
public java.lang.String methodDescriptorAt(int methodRefInfoIdx)
public java.lang.String methodTypeDescriptorAt(int methodTypeInfoIdx)
public java.lang.String interfaceMethodClassNameAt(int ifcMethodRefInfoIdx)
public java.lang.String interfaceMethodNameAt(int ifcMethodRefInfoIdx)
public java.lang.String interfaceMethodDescriptorAt(int ifcMethodRefInfoIdx)
public int bootstrapMethodIndex(int cpInvokeDynamicIndex)
public java.lang.String samMethodNameAt(int cpInvokeDynamicIndex)
public java.lang.String callSiteDescriptor(int cpInvokeDynamicIndex)
public java.lang.String getRefTypeName(int refCode)
public java.lang.String getTypeName(int typeCode)
public int getPos()
getPos
in class BinaryClassSource
public int getPc()
public int getNumberOfCpEntries()
public java.lang.Object getCpValue(int i)
public int getCpTag(int i)
public int getDataPosOfCpEntry(int i)
public java.lang.Object getConstValueAttribute(int dataPos)
public java.lang.String getSourceFileAttribute(int dataPos)
public final int u1(int dataIdx)
public final int u2(int dataIdx)
public final int i1(int dataIdx)
public final int i2(int dataIdx)
public final int readU2()
public final int readI2()
public final int readI4()
public void setAnnotationValuesDone(ClassFileReader reader, java.lang.Object tag, int annotationIndex)
public void setSignature(ClassFileReader reader, java.lang.Object tag, java.lang.String signature)
public void parse(ClassFileReader reader) throws ClassParseException
ClassParseException
public static java.lang.String readModifiedUTF8String(byte[] data, int pos, int len) throws ClassParseException
ClassParseException
protected void parseCp(int cpCount) throws ClassParseException
ClassParseException
protected void parseInterfaces(ClassFileReader reader, int ifcCount)
protected void parseFields(ClassFileReader reader, int fieldCount)
protected void parseFieldAttributes(ClassFileReader reader, int fieldIdx, int attrCount)
public void parseConstValueAttr(ClassFileReader reader, java.lang.Object tag)
protected void parseMethods(ClassFileReader reader, int methodCount)
protected void parseMethodAttributes(ClassFileReader reader, int methodIdx, int attrCount)
public void parseExceptionAttr(ClassFileReader reader, java.lang.Object tag)
public void parseCodeAttr(ClassFileReader reader, java.lang.Object tag)
protected void parseCodeAttrAttributes(ClassFileReader reader, java.lang.Object tag, int attrCount)
public void parseLineNumberTableAttr(ClassFileReader reader, java.lang.Object tag)
public void parseLocalVarTableAttr(ClassFileReader reader, java.lang.Object tag)
protected void parseClassAttributes(ClassFileReader reader, int attrCount)
public void parseSourceFileAttr(ClassFileReader reader, java.lang.Object tag)
public void parseInnerClassesAttr(ClassFileReader reader, java.lang.Object tag)
public void parseEnclosingMethodAttr(ClassFileReader reader, java.lang.Object tag)
public void parseBootstrapMethodAttr(ClassFileReader reader, java.lang.Object tag)
public void parseAnnotationsAttr(ClassFileReader reader, java.lang.Object tag)
public static java.lang.String getTargetTypeName(int targetType)
public static java.lang.String getTypePathEncoding(short[] typePath)
public static java.lang.String getScopeEncoding(long[] scopeEntries)
public void parseTypeAnnotationsAttr(ClassFileReader reader, java.lang.Object tag)
public void parseParameterAnnotationsAttr(ClassFileReader reader, java.lang.Object tag)
public void parseSignatureAttr(ClassFileReader reader, java.lang.Object tag)
public void parseAnnotationDefaultAttr(ClassFileReader reader, java.lang.Object tag)
public void parseBytecode(JVMByteCodeReader reader, java.lang.Object tag, int codeLength)
public void parseTableSwitchEntries(JVMByteCodeReader reader, int low, int high)
public int getTableSwitchOffset(int low, int high, int defaultOffset, int val)
public void parseLookupSwitchEntries(JVMByteCodeReader reader, int nEntries)
public int getLookupSwitchOffset(int nEntries, int defaultOffset, int val)