java高*之class文件解析

时间:2022-02-05 14:07:01

java高*之class文件解析

class文件的结构这里不再说了,网上有很多资料,也可以看《深入理解Java虚拟机 JVM高级特性与最佳实践》,里面对class文件结构的描述很详细。

这里我们主要使用java语言解析自身的class文件内容,因为代码不能全部贴在这里,所以上传到了下载频道。代码下载地址:
http://download.csdn.net/detail/maosijunzi/8644009

源码

public class Test<T>{
private int num;
private final static int numstatic = 100;
@Deprecated
public static void method1(int param1,String param2)throws Exception{
int i = 10;
try{
i++;
}catch(Exception e){
e.printStackTrace();
}finally{
i++;
}
System.out.println(i);
}
public void method2(T t){
System.out.println(t);
}
public static void main(String ... args)throws Exception{
method1(1,"aaa");

Test<String> t = new Test<String>();
t.method2("hello ");
}
private static class User{
private String name;
public String getName(){
return this.name;
}
}
}

解析结果

魔数:CA FE BA BE  次版本:00  主版本:034
常量池大小:85 索引范围1-85
1 tag=10 classInfoIndex=13 nameAndTypeIndex=62
2 tag=7 index=63
3 tag=10 classInfoIndex=2 nameAndTypeIndex=64
4 tag=9 classInfoIndex=65 nameAndTypeIndex=66
5 tag=10 classInfoIndex=67 nameAndTypeIndex=68
6 tag=10 classInfoIndex=67 nameAndTypeIndex=69
7 tag=8 index=70
8 tag=10 classInfoIndex=9 nameAndTypeIndex=71
9 tag=7 index=72
10 tag=10 classInfoIndex=9 nameAndTypeIndex=62
11 tag=8 index=73
12 tag=10 classInfoIndex=9 nameAndTypeIndex=74
13 tag=7 index=75
14 tag=7 index=76
15 tag=1 length=4 content=User
16 tag=1 length=12 content=InnerClasses
17 tag=1 length=3 content=num
18 tag=1 length=1 content=I
19 tag=1 length=9 content=numstatic
20 tag=1 length=13 content=ConstantValue
21 tag=3 num=100
22 tag=1 length=6 content=<init>
23 tag=1 length=3 content=()V
24 tag=1 length=4 content=Code
25 tag=1 length=15 content=LineNumberTable
26 tag=1 length=18 content=LocalVariableTable
27 tag=1 length=4 content=this
28 tag=1 length=6 content=LTest;
29 tag=1 length=22 content=LocalVariableTypeTable
30 tag=1 length=11 content=LTest<TT;>;
31 tag=1 length=7 content=method1
32 tag=1 length=22 content=(ILjava/lang/String;)V
33 tag=1 length=1 content=e
34 tag=1 length=21 content=Ljava/lang/Exception;
35 tag=1 length=6 content=param1
36 tag=1 length=6 content=param2
37 tag=1 length=18 content=Ljava/lang/String;
38 tag=1 length=1 content=i
39 tag=1 length=13 content=StackMapTable
40 tag=7 index=77
41 tag=7 index=63
42 tag=7 index=78
43 tag=1 length=10 content=Exceptions
44 tag=1 length=10 content=Deprecated
45 tag=1 length=25 content=RuntimeVisibleAnnotations
46 tag=1 length=22 content=Ljava/lang/Deprecated;
47 tag=1 length=7 content=method2
48 tag=1 length=21 content=(Ljava/lang/Object;)V
49 tag=1 length=1 content=t
50 tag=1 length=18 content=Ljava/lang/Object;
51 tag=1 length=3 content=TT;
52 tag=1 length=9 content=Signature
53 tag=1 length=6 content=(TT;)V
54 tag=1 length=4 content=main
55 tag=1 length=22 content=([Ljava/lang/String;)V
56 tag=1 length=4 content=args
57 tag=1 length=19 content=[Ljava/lang/String;
58 tag=1 length=26 content=LTest<Ljava/lang/String;>;
59 tag=1 length=40 content=<T:Ljava/lang/Object;>Ljava/lang/Object;
60 tag=1 length=10 content=SourceFile
61 tag=1 length=9 content=Test.java
62 tag=12 nameIndex=22 descIndex=23
63 tag=1 length=19 content=java/lang/Exception
64 tag=12 nameIndex=79 descIndex=23
65 tag=7 index=80
66 tag=12 nameIndex=81 descIndex=82
67 tag=7 index=83
68 tag=12 nameIndex=84 descIndex=85
69 tag=12 nameIndex=84 descIndex=48
70 tag=1 length=3 content=aaa
71 tag=12 nameIndex=31 descIndex=32
72 tag=1 length=4 content=Test
73 tag=1 length=6 content=hello
74 tag=12 nameIndex=47 descIndex=48
75 tag=1 length=16 content=java/lang/Object
76 tag=1 length=9 content=Test$User
77 tag=1 length=16 content=java/lang/String
78 tag=1 length=19 content=java/lang/Throwable
79 tag=1 length=15 content=printStackTrace
80 tag=1 length=16 content=java/lang/System
81 tag=1 length=3 content=out
82 tag=1 length=21 content=Ljava/io/PrintStream;
83 tag=1 length=19 content=java/io/PrintStream
84 tag=1 length=7 content=println
85 tag=1 length=4 content=(I)V
访问标识:33 ACC_PUBLIC, ACC_SUPER,
类名:Test 父类:java/lang/Object 接口引用数量:0
字段长度:2
字段访问标识: ACC_PRIVATE, nameIndex=17 descIndex=18 attributesCount=0
字段访问标识: ACC_PRIVATE, ACC_STATIC, ACC_FINAL, nameIndex=19 descIndex=18 attributesCount=1
Attribute_constantsValue: constantsValueIndex=21
方法长度:4
方法访问标识: ACC_PUBLIC nameIndex=22 descIndex=23 attributesCount=1
maxStack=1 maxLocal=1
codeLength=5
code[0]=aload_0
code[1]=invokespecial
code[2]=nop
code[3]=aconst_null
code[4]=return0
Attribute_lineNumberTable: 字节码行号=0 源码行号=1
Attribute_lineNumberTable: 字节码行号=4 源码行号=31
Attribute_localvariabletable: localvariabletableLength=1 startPc=0 length=5 nameIndex=27 descIndex=28 index=0
Attribute_localvariabletypetable: localvariabletableLength=1 startPc=0 length=5 nameIndex=27 signature=30 index=0
方法访问标识: ACC_PUBLIC ACC_STATIC nameIndex=31 descIndex=32 attributesCount=4
maxStack=2 maxLocal=5
codeLength=39
code[0]=bipush
code[1]=lconst_1
code[2]=istore_2
code[3]=iinc
code[4]=iconst_m1
code[5]=aconst_null
code[6]=iinc
code[7]=iconst_m1
code[8]=aconst_null
code[9]=go_to
code[10]=nop
code[11]=lload
code[12]=astore_3
code[13]=aload_3
code[14]=invokevirtual
code[15]=nop
code[16]=iconst_0
code[17]=iinc
code[18]=iconst_m1
code[19]=aconst_null
code[20]=go_to
code[21]=nop
code[22]=fconst_0
code[23]=astore
code[24]=iconst_1
code[25]=iinc
code[26]=iconst_m1
code[27]=aconst_null
code[28]=aload
code[29]=iconst_1
code[30]=athrow
code[31]=getstatic
code[32]=nop
code[33]=iconst_1
code[34]=iload_2
code[35]=invokevirtual
code[36]=nop
code[37]=iconst_2
code[38]=return0
异常: startPc=3 endPc=6 handlePc=12 catchType=2
异常: startPc=3 endPc=6 handlePc=23 catchType=0
异常: startPc=12 endPc=17 handlePc=23 catchType=0
异常: startPc=23 endPc=25 handlePc=23 catchType=0
Attribute_lineNumberTable: 字节码行号=0 源码行号=7
Attribute_lineNumberTable: 字节码行号=3 源码行号=9
Attribute_lineNumberTable: 字节码行号=6 源码行号=13
Attribute_lineNumberTable: 字节码行号=9 源码行号=14
Attribute_lineNumberTable: 字节码行号=12 源码行号=10
Attribute_lineNumberTable: 字节码行号=13 源码行号=11
Attribute_lineNumberTable: 字节码行号=17 源码行号=13
Attribute_lineNumberTable: 字节码行号=20 源码行号=14
Attribute_lineNumberTable: 字节码行号=23 源码行号=13
Attribute_lineNumberTable: 字节码行号=31 源码行号=15
Attribute_lineNumberTable: 字节码行号=38 源码行号=16
Attribute_localvariabletable: localvariabletableLength=4 startPc=13 length=4 nameIndex=33 descIndex=34 index=3
Attribute_localvariabletable: localvariabletableLength=4 startPc=0 length=39 nameIndex=35 descIndex=18 index=0
Attribute_localvariabletable: localvariabletableLength=4 startPc=0 length=39 nameIndex=36 descIndex=37 index=1
Attribute_localvariabletable: localvariabletableLength=4 startPc=3 length=36 nameIndex=38 descIndex=18 index=2
numOfEntries=3
offset_delta12
integer_variable_info
object_variable_info index=40
integer_variable_info
object_variable_info index=41
object_variable_info index=42
Attribute_exceptions: numOfExceptions=1 exceptionIndexTable=2
没有解析此属性表
方法访问标识: ACC_PUBLIC nameIndex=47 descIndex=48 attributesCount=2
maxStack=2 maxLocal=2
codeLength=8
code[0]=getstatic
code[1]=nop
code[2]=iconst_1
code[3]=aload_1
code[4]=invokevirtual
code[5]=nop
code[6]=iconst_3
code[7]=return0
Attribute_lineNumberTable: 字节码行号=0 源码行号=20
Attribute_lineNumberTable: 字节码行号=7 源码行号=21
Attribute_localvariabletable: localvariabletableLength=2 startPc=0 length=8 nameIndex=27 descIndex=28 index=0
Attribute_localvariabletable: localvariabletableLength=2 startPc=0 length=8 nameIndex=49 descIndex=50 index=1
Attribute_localvariabletypetable: localvariabletableLength=2 startPc=0 length=8 nameIndex=27 signature=30 index=0
Attribute_localvariabletypetable: localvariabletableLength=2 startPc=0 length=8 nameIndex=49 signature=51 index=1
Attribute_signature:signatureIndex=53 = (TT;)V
方法访问标识: ACC_PUBLIC ACC_STATIC ACC_TRANSIENT nameIndex=54 descIndex=55 attributesCount=2
maxStack=2 maxLocal=2
codeLength=21
code[0]=iconst_1
code[1]=ldc
code[2]=iconst_4
code[3]=invokestatic
code[4]=nop
code[5]=iconst_5
code[6]=new0
code[7]=nop
code[8]=lconst_0
code[9]=dup
code[10]=invokespecial
code[11]=nop
code[12]=lconst_1
code[13]=astore_1
code[14]=aload_1
code[15]=ldc
code[16]=fconst_0
code[17]=invokevirtual
code[18]=nop
code[19]=fconst_1
code[20]=return0
Attribute_lineNumberTable: 字节码行号=0 源码行号=24
Attribute_lineNumberTable: 字节码行号=6 源码行号=26
Attribute_lineNumberTable: 字节码行号=14 源码行号=27
Attribute_lineNumberTable: 字节码行号=20 源码行号=28
Attribute_localvariabletable: localvariabletableLength=2 startPc=0 length=21 nameIndex=56 descIndex=57 index=0
Attribute_localvariabletable: localvariabletableLength=2 startPc=14 length=7 nameIndex=49 descIndex=28 index=1
Attribute_localvariabletypetable: localvariabletableLength=1 startPc=14 length=7 nameIndex=49 signature=58 index=1
Attribute_exceptions: numOfExceptions=1 exceptionIndexTable=2
属性表大小:3
Attribute_signature:signatureIndex=59 = <T:Ljava/lang/Object;>Ljava/lang/Object;
sourceFileIndex=61
Attribute_innerClasses: numOfClasses=1 innerClassInfoIndex=14 outerClassInfoIndex=9 innerNameIndex=15 innerClassAccessFlags=10:ACC_PRIVATE,:ACC_STATIC,