使用 javap 反编译字节码(补充 javac)

javap是JDK自带的工具,用于反编译.class文件,展示包括公共和保护级别的类属性和方法。通过命令行参数可以获取详细信息,如在示例中展示了如何使用javap-v输出Test.class的内容,包括类信息、字节码、常量池等。当直接使用javac编译时,某些信息可能不全,需使用javac-g选项获取完整本地变量表等详情。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

官网地址

版本JDK8:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javap.html

概述

JDK 自带的一个工具,作为 .class 文件解析器,可通过 javap 命令反编译一个或者多个 .class 文件,输出结果取决于输入参数,默认输出 protected 和 public 限定的类属性和方法。

参数说明

命令行窗口执行 javap -help
javap

示例

public class Test {
    public String var1;
    public final String var2 = "hello word";
}
zhangyu:javap zy$ javac Test.java 
zhangyu:javap zy$ javap -v Test.class > Test_v.txt
zhangyu:javap zy$ cat Test_v.txt 
Classfile /Users/zy/Desktop/WorkSpace/jvm/src/main/java/com/dailycode/jvm/javap/Test.class
  Last modified 2023-1-4; size 317 bytes
  MD5 checksum f58420e5381c4b7c5a07ce80abc67a3f
  Compiled from "Test.java"
public class com.dailycode.jvm.javap.Test
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #5.#16         // java/lang/Object."<init>":()V
   #2 = String             #17            // hello word
   #3 = Fieldref           #4.#18         // com/dailycode/jvm/javap/Test.var2:Ljava/lang/String;
   #4 = Class              #19            // com/dailycode/jvm/javap/Test
   #5 = Class              #20            // java/lang/Object
   #6 = Utf8               var1
   #7 = Utf8               Ljava/lang/String;
   #8 = Utf8               var2
   #9 = Utf8               ConstantValue
  #10 = Utf8               <init>
  #11 = Utf8               ()V
  #12 = Utf8               Code
  #13 = Utf8               LineNumberTable
  #14 = Utf8               SourceFile
  #15 = Utf8               Test.java
  #16 = NameAndType        #10:#11        // "<init>":()V
  #17 = Utf8               hello word
  #18 = NameAndType        #8:#7          // var2:Ljava/lang/String;
  #19 = Utf8               com/dailycode/jvm/javap/Test
  #20 = Utf8               java/lang/Object
{
  public java.lang.String var1;
    descriptor: Ljava/lang/String;
    flags: ACC_PUBLIC

  public final java.lang.String var2;
    descriptor: Ljava/lang/String;
    flags: ACC_PUBLIC, ACC_FINAL
    ConstantValue: String hello word

  public com.dailycode.jvm.javap.Test();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: aload_0
         5: ldc           #2                  // String hello word
         7: putfield      #3                  // Field var2:Ljava/lang/String;
        10: return
      LineNumberTable:
        line 7: 0
        line 10: 4
}
SourceFile: "Test.java"
zhangyu:javap zy$ 

javac

直接用 javac 编译信息是不全的、比如看不到 LocalVariableTable 信息、此时就需要使用 javac -g xxx.java
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值