当前位置: 代码迷 >> 综合 >> 第六章+类文件结构+javap
  详细解决方案

第六章+类文件结构+javap

热度:67   发布时间:2023-12-11 22:04:43.0

使用javap打印常量表和计算字节码指令

javap 介绍

javap是 JDK自带的一个工具,可以将 class文件反编译成字节码,它并没有将class文件反编译成 java文件,但是依然反编译成程序员能读的格式。

1,编译源程序

源程序(我使用的是myeclipse):

package t;public class TestClass{private int m;public int inc(){return m+1;}
}

在myeclipse中,编译源程序:

必须确保你的myeclipse中菜单-->project(项目)--> build automatically (自动构建)这一项被选中打勾这样你写代码的时候,按下ctrl+S(保存) ,系统就会自动帮你编译,就是生成了TestClass.class字节码文件,才能使用javap

查看TestClass.class的文件位置

2,cmd 进入class目录, javap -verbose classname

书中代码清单6-2和6-4

Microsoft Windows [版本 10.0.17763.316]
(c) 2018 Microsoft Corporation。保留所有权利。C:\Users\ee>
C:\Users\ee>cd Workspaces/MyEclipse 10/TEST/bin/t/C:\Users\ee\Workspaces\MyEclipse 10\TEST\bin\t>javap -verbose TestClass
警告: 二进制文件TestClass包含t.TestClass
Classfile /C:/Users/ee/Workspaces/MyEclipse 10/TEST/bin/t/TestClass.classLast modified 2019-3-7; size 357 bytesMD5 checksum 63be3f690d4eb235eaf51ab7529a6462Compiled from "TestClass.java"
public class t.TestClassSourceFile: "TestClass.java"minor version: 0major version: 51flags: ACC_PUBLIC, ACC_SUPER
Constant pool:#1 = Class              #2             //  t/TestClass#2 = Utf8               t/TestClass#3 = Class              #4             //  java/lang/Object#4 = Utf8               java/lang/Object#5 = Utf8               m#6 = Utf8               I#7 = Utf8               <init>#8 = Utf8               ()V#9 = Utf8               Code#10 = Methodref          #3.#11         //  java/lang/Object."<init>":()V#11 = NameAndType        #7:#8          //  "<init>":()V#12 = Utf8               LineNumberTable#13 = Utf8               LocalVariableTable#14 = Utf8               this#15 = Utf8               Lt/TestClass;#16 = Utf8               inc#17 = Utf8               ()I#18 = Fieldref           #1.#19         //  t/TestClass.m:I#19 = NameAndType        #5:#6          //  m:I#20 = Utf8               SourceFile#21 = Utf8               TestClass.java
{public t.TestClass();flags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #10                 // Method java/lang/Object."<init>":()V4: returnLineNumberTable:line 3: 0LocalVariableTable:Start  Length  Slot  Name   Signature0       5     0  this   Lt/TestClass;public int inc();flags: ACC_PUBLICCode:stack=2, locals=1, args_size=10: aload_01: getfield      #18                 // Field m:I4: iconst_15: iadd6: ireturnLineNumberTable:line 7: 0LocalVariableTable:Start  Length  Slot  Name   Signature0       7     0  this   Lt/TestClass;
}C:\Users\ee\Workspaces\MyEclipse 10\TEST\bin\t>

还有一些javac的东西,没遇到,懒得写,附上别人博客