读书人

学习JVM原理-10. 用javap分析bytecode

发布时间: 2012-12-25 16:18:28 作者: rapoo

学习JVM原理-10. 用javap分析bytecode文件中的Constant Pool
受教于《深入理解Java虚拟机》周志明著

直接看ByteCode文件会累死的,我们可以用JDK附带的javap -verbose A.class 来生成可读的信息.

下面就举个例子,看下这类信息中的Constant Pool部分


package pool;public class PlayConstant {private static final int DEFAULT_PLAYER_COUNT = 55;private String gameName;public Long getMoney(int playerCount) {long money = 10 * playerCount;return money;}}


一起来分析一下它的Constant Pool:



const #1 = class#2;//  pool/PlayConstant  --#2意思是它的值在Pool中的第#2个位置const #2 = Ascizpool/PlayConstant;const #3 = class#4;//  java/lang/Object   --父类const #4 = Ascizjava/lang/Object;const #5 = AscizDEFAULT_PLAYER_COUNT;          --常量名const #6 = AscizI;                             --常量类型,I意思是intconst #7 = AscizConstantValue;                 --将为常量设值const #8 = int55;                                    --常量值为55const #9 = AscizgameName;                      --成员变量名    const #10 = AscizLjava/lang/String;;            --成员变量类型,凡是对象都会在类型前加个"L"const #11 = Asciz<init>;                        --构造方法const #12 = Asciz()V;                           --构造方法为voidconst #13 = AscizCode;                          const #14 = Method#3.#15;//  java/lang/Object."<init>":()V --所调用的父类构造方法的签名const #15 = NameAndType#11:#12;//  "<init>":()Vconst #16 = AscizLineNumberTable;               --编译时记录了Line Numberconst #17 = AscizLocalVariableTable;            --编译时记录了变量名const #18 = Ascizthis;                          --this_classconst #19 = AscizLpool/PlayConstant;;           --本类的全名const #20 = AscizgetMoney;                      --成员方法名const #21 = Asciz(I)Ljava/lang/Long;;           --成员方法返回类型const #22 = Method#23.#25;//  java/lang/Long.valueOf(J)Ljava/lang/Long;const #23 = class#24;//  java/lang/Longconst #24 = Ascizjava/lang/Long;const #25 = NameAndType#26:#27;//  valueOf:(J)Ljava/lang/Long;const #26 = AscizvalueOf;const #27 = Asciz(J)Ljava/lang/Long;;           --方法的参数的类型const #28 = AscizplayerCount;                   --方法的参数名const #29 = Ascizmoney;                         --方法里面的局部变量名const #30 = AscizJ;                             --局部变量类型: longconst #31 = AscizSourceFile;                    --编译时记录了源文件名const #32 = AscizPlayConstant.java;             --源文件名
1 楼 daly1987 2011-12-19 不错啊。学习了

读书人网 >编程

热点推荐