学习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 不错啊。学习了