public class ClassFile extends Object
Modifier and Type | Class and Description |
---|---|
static class |
ClassFile.CpInfo |
Constructor and Description |
---|
ClassFile(byte[] data) |
ClassFile(byte[] data,
int offset) |
ClassFile(File file) |
ClassFile(String pathName) |
ClassFile(String typeName,
byte[] data) |
ClassFile(String typeName,
byte[] data,
int offset) |
Modifier and Type | Method and Description |
---|---|
String |
classNameAt(int classInfoIdx) |
double |
doubleAt(int doubleInfoIdx) |
protected void |
error(String msg) |
String |
fieldClassNameAt(int fieldRefInfoIdx) |
String |
fieldDescriptorAt(int fieldRefInfoIdx) |
String |
fieldNameAt(int fieldRefInfoIdx) |
float |
floatAt(int floatInfoIdx) |
Object |
getConstValueAttribute(int dataPos) |
int |
getCpTag(int i) |
Object |
getCpValue(int i) |
byte[] |
getData()
obtain current classfile data.
|
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() |
String |
getRequestedTypeName()
return the typename this classfile gets loaded for
<2do> this is going away
|
String |
getSourceFileAttribute(int dataPos) |
int |
getTableSwitchOffset(int low,
int high,
int defaultOffset,
int val) |
String |
getTypeName(int typeCode) |
int |
i1(int dataIdx) |
int |
i2(int dataIdx) |
int |
intAt(int intInfoIdx) |
String |
interfaceMethodClassNameAt(int ifcMethodRefInfoIdx) |
String |
interfaceMethodDescriptorAt(int ifcMethodRefInfoIdx) |
String |
interfaceMethodNameAt(int ifcMethodRefInfoIdx) |
protected String |
internStdAttrName(int cpIdx,
String name,
String[] stdNames) |
long |
longAt(int longInfoIdx) |
String |
methodClassNameAt(int methodRefInfoIdx) |
String |
methodDescriptorAt(int methodRefInfoIdx) |
String |
methodNameAt(int methodRefInfoIdx) |
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,
Object tag)
AnnotationDefault_attribute {
u2 attribute_name_index;
u4 attribute_length;
element_value default_value; << pos
}
|
void |
parseAnnotationsAttr(ClassFileReader reader,
Object tag) |
void |
parseBytecode(JVMByteCodeReader reader,
Object tag,
int codeLength) |
protected void |
parseClassAttributes(ClassFileReader reader,
int attrCount) |
void |
parseCodeAttr(ClassFileReader reader,
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,
Object tag,
int attrCount) |
void |
parseConstValueAttr(ClassFileReader reader,
Object tag)
optionally called by reader to obtain a ConstantValue field attribute
ConstantValue {u2 attrName
|
protected void |
parseCp(int cpCount) |
void |
parseEnclosingMethodAttr(ClassFileReader reader,
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,
Object tag) |
protected void |
parseFieldAttributes(ClassFileReader reader,
int fieldIdx,
int attrCount) |
protected void |
parseFields(ClassFileReader reader,
int fieldCount) |
void |
parseInnerClassesAttr(ClassFileReader reader,
Object tag)
(optionally) called by ClassFileReader from within setClassAttribute() notification
InnerClass { u2 nameIdx
|
protected void |
parseInterfaces(ClassFileReader reader,
int ifcCount) |
void |
parseLineNumberTableAttr(ClassFileReader reader,
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,
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,
Object tag) |
void |
parseSignatureAttr(ClassFileReader reader,
Object tag)
Signature_attribute {
u2 attribute_name_index;
u4 attr-length;
u2 signature-index << pos
}
|
void |
parseSourceFileAttr(ClassFileReader reader,
Object tag)
(optionally) called by ClassFileReader from within setClassAttribute() notification
InnerClass { u2 nameIdx
|
void |
parseTableSwitchEntries(JVMByteCodeReader reader,
int low,
int high) |
byte |
readByte() |
protected void |
readData(InputStream is) |
int |
readI1() |
int |
readI2() |
int |
readI4() |
static String |
readModifiedUTF8String(byte[] data,
int pos,
int len) |
int |
readU1() |
int |
readU2() |
String |
refClassNameAt(int cpIdx) |
String |
refDescriptorAt(int cpIdx) |
String |
refNameAt(int cpIdx) |
void |
setAnnotationValuesDone(ClassFileReader reader,
Object tag,
int annotationIndex) |
void |
setData(byte[] newData)
set classfile data.
|
void |
setSignature(ClassFileReader reader,
Object tag,
String signature) |
void |
stopParsing() |
String |
stringAt(int stringInfoIdx) |
int |
u1(int dataIdx) |
int |
u2(int dataIdx) |
String |
utf8At(int utf8InfoIdx) |
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 String SYNTHETIC_ATTR
public static final String DEPRECATED_ATTR
public static final String SIGNATURE_ATTR
public static final String RUNTIME_INVISIBLE_ANNOTATIONS_ATTR
public static final String RUNTIME_VISIBLE_ANNOTATIONS_ATTR
public static final String CONST_VALUE_ATTR
protected static final String[] stdFieldAttrs
public static final String CODE_ATTR
public static final String EXCEPTIONS_ATTR
public static final String RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS_ATTR
public static final String RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS_ATTR
public static final String ANNOTATIONDEFAULT_ATTR
protected static final String[] stdMethodAttrs
public static final String LINE_NUMBER_TABLE_ATTR
public static final String LOCAL_VAR_TABLE_ATTR
protected static final String[] stdCodeAttrs
public static final String SOURCE_FILE_ATTR
public static final String INNER_CLASSES_ATTR
public static final String ENCLOSING_METHOD_ATTR
protected static final String[] stdClassAttrs
public ClassFile(byte[] data, int offset)
public ClassFile(byte[] data)
public ClassFile(String typeName, byte[] data)
public ClassFile(String typeName, byte[] data, int offset)
public ClassFile(File file) throws ClassParseException
ClassParseException
public ClassFile(String pathName) throws ClassParseException
ClassParseException
public byte[] getData()
public void setData(byte[] newData)
public String getRequestedTypeName()
public void stopParsing()
protected void error(String msg) throws ClassParseException
ClassParseException
protected void readData(InputStream is) throws ClassParseException
ClassParseException
public 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 String classNameAt(int classInfoIdx)
public String stringAt(int stringInfoIdx)
public String refClassNameAt(int cpIdx)
public String refNameAt(int cpIdx)
public String refDescriptorAt(int cpIdx)
public String fieldClassNameAt(int fieldRefInfoIdx)
public String fieldNameAt(int fieldRefInfoIdx)
public String fieldDescriptorAt(int fieldRefInfoIdx)
public String methodClassNameAt(int methodRefInfoIdx)
public String methodNameAt(int methodRefInfoIdx)
public String methodDescriptorAt(int methodRefInfoIdx)
public String interfaceMethodClassNameAt(int ifcMethodRefInfoIdx)
public String interfaceMethodNameAt(int ifcMethodRefInfoIdx)
public String interfaceMethodDescriptorAt(int ifcMethodRefInfoIdx)
public String getTypeName(int typeCode)
public int getPos()
public int getPc()
public int getNumberOfCpEntries()
public Object getCpValue(int i)
public int getCpTag(int i)
public int getDataPosOfCpEntry(int i)
public Object getConstValueAttribute(int dataPos)
public 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 readU1()
public final byte readByte()
public final int readI1()
public final int readU2()
public final int readI2()
public final int readI4()
public void setAnnotationValuesDone(ClassFileReader reader, Object tag, int annotationIndex)
public void setSignature(ClassFileReader reader, Object tag, String signature)
public void parse(ClassFileReader reader) throws ClassParseException
ClassParseException
public static 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, Object tag)
protected void parseMethods(ClassFileReader reader, int methodCount)
protected void parseMethodAttributes(ClassFileReader reader, int methodIdx, int attrCount)
public void parseExceptionAttr(ClassFileReader reader, Object tag)
public void parseCodeAttr(ClassFileReader reader, Object tag)
protected void parseCodeAttrAttributes(ClassFileReader reader, Object tag, int attrCount)
public void parseLineNumberTableAttr(ClassFileReader reader, Object tag)
public void parseLocalVarTableAttr(ClassFileReader reader, Object tag)
protected void parseClassAttributes(ClassFileReader reader, int attrCount)
public void parseSourceFileAttr(ClassFileReader reader, Object tag)
public void parseInnerClassesAttr(ClassFileReader reader, Object tag)
public void parseEnclosingMethodAttr(ClassFileReader reader, Object tag)
public void parseAnnotationsAttr(ClassFileReader reader, Object tag)
public void parseParameterAnnotationsAttr(ClassFileReader reader, Object tag)
public void parseSignatureAttr(ClassFileReader reader, Object tag)
public void parseAnnotationDefaultAttr(ClassFileReader reader, Object tag)
public void parseBytecode(JVMByteCodeReader reader, 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)