第六章+类文件结构+javap
使用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.class
Last modified 2019-3-7; size 357 bytes
MD5 checksum 63be3f690d4eb235eaf51ab7529a6462
Compiled from "TestClass.java"
public class t.TestClass
SourceFile: "TestClass.java"
minor version: 0
major version: 51
flags: 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_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #10 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 3: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lt/TestClass;
public int inc();
flags: ACC_PUBLIC
Code:
stack=2, locals=1, args_size=1
0: aload_0
1: getfield #18 // Field m:I
4: iconst_1
5: iadd
6: ireturn
LineNumberTable:
line 7: 0
LocalVariableTable:
Start Length Slot Name Signature
0 7 0 this Lt/TestClass;
}
C:\Users\ee\Workspaces\MyEclipse 10\TEST\bin\t>
还有一些javac的东西,没遇到,懒得写,附上别人博客