idea安装javap -c

本文介绍了如何在IntelliJIDEA中配置并使用javap-c指令来查看.java文件编译后的.class文件结构,包括设置JavaBytecodeDecompiler插件和外部工具配置。

一、概述

        javap -c是一个能够将.java文件反编译为.class文件的指令,例如我在idea中编写了一个Car.java文件,我想看看这个类被编译后长什么样的,就可以使用该指令进行查看。

二、配置

2.1、 Java Bytecode Decompiler

File===>Settings===>Plugins===>Installed===>检查 Java Bytecode Decompiler 是否处于启用状态。默认是启用的。

2.2、添加javap -c指令

File===>Settings===>Tools===>External Tools===>新建指令

参数解释:

        Name:工具名称(随便起,建议起的通俗易懂,见名之意)

        Group:分组,使用默认的即可

        Description:工具的描述信息

        Program:JDK中javap.exe的路径,根据自己的实际情况进行填写

        Arguments:由于解析的是.class文件,所以这个参数配置的是.class文件所在的目录,也就是项目的输出目录

        Working directory:配置好Program后,会自动填充,使用自动填充的就行

 三、测试

<think> 我们正在讨论javap命令的用法。用户的问题是基于之前的对话,但之前主要讨论的是JNI中GetFieldID返回空的问题,现在用户转向了javap的用法。 根据引用[2]和引用[3],我们可以详细说明javap的用法。 用户的问题:我想了解javap命令的用法 我们需要组织一个清晰的结构,介绍javap的基本用法、常用选项和示例。 结构建议: 1. 什么是javap? 2. 基本语法 3. 常用选项(重点) 4. 使用示例(包括如何查看字段签名,因为之前上下文涉及JNI字段签名) 5. 在IDE(如IntelliJ IDEA)中如何配置javap(参考引用[5]) 6. 相关问题 注意:用户之前的上下文是关于JNI字段签名的,所以示例中可以侧重展示如何获取字段签名(使用-s选项)。 另外,根据引用[4]可知,javap可以查看类文件的详细信息(版本号、常量池等),也可以简要提及。 由于用户要求使用中文,且需要生成相关问题,我们按照要求回答。 </think> ### `javap`命令详解:Java字节码反编译工具 `javap`是JDK内置的命令行工具,用于反编译`.class`文件,帮助开发者分析字节码结构、验证字段签名、理解编译器优化等。以下为核心用法: --- #### **一、基础语法** ```bash javap [options] <classname> ``` - **`<classname>`**:完整类名(如`com.example.MyClass`)或`.class`文件路径 - **关键限制**:需在类所在目录执行,或通过`-classpath`指定路径[^2][^3] --- #### **二、常用选项与功能** | **选项** | **作用** | **应用场景** | |----------------|------------------------------------------------------------------------|--------------------------------| | `-c` | 反编译字节码指令(显示JVM操作码) | 分析方法逻辑、性能优化[^4] | | `-s` | **输出字段/方法签名**(含JNI格式签名) | JNI开发中验证字段签名(如`Lcom/example/Data;`)[^1] | | `-l` | 显示行号(LineNumberTable)和局部变量表(LocalVariableTable) | 调试异常堆栈定位 | | `-verbose` | 输出完整类信息:版本号、常量池、访问标志等 | 深度分析类结构[^4] | | `-private` | 显示所有成员(包括`private`) | 检查私有字段/方法 | | `-classpath <path>` | 指定类搜索路径(覆盖默认`CLASSPATH`) | 反编译非当前目录的类 | > **示例**:获取`com.example.Container`类的字段签名(JNI所需): > ```bash > javap -s -private com.example.Container > ``` > 输出字段签名: > ``` > public com.example.Data myField; > descriptor: Lcom/example/Data; # 直接用于JNI的GetFieldID[^1] > ``` --- #### **三、典型使用场景** 1. **JNI开发验证签名** ```bash # 获取DataProcessor类的所有方法签名 javap -s com.example.DataProcessor ``` ```java public void process(com.example.Data); descriptor: (Lcom/example/Data;)V # JNI签名: (Lcom/example/Data;)V ``` 2. **编译器行为分析** ```bash # 对比源代码与字节码指令 javap -c -l MyClass.class ``` ```java public void calculate(); Code: 0: iload_1 1: iload_2 2: iadd 3: istore_3 LineNumberTable: line 15: 0 LocalVariableTable: Start Length Slot Name Signature 0 4 0 this LMyClass; ``` 3. **混淆问题排查** ```bash # 检查Release版本被混淆的类 javap -c -classpath ./app/build/outputs/apk MyObfuscatedClass ``` --- #### **四、IDE集成(IntelliJ IDEA)** 1. **配置外部工具**: `Settings > Tools > External Tools` → 添加新工具: - **Name**: `Javap` - **Program**: `$JDK_PATH$/bin/javap` - **Arguments**: `-c -s $FileClass$` - **Working directory**: `$OutputPath$` [配置示意图参考引用[5]](#) 2. **使用**: 右键点击Java类 → `External Tools > Javap` → 控制台输出反编译结果[^5] --- #### **五、注意事项** 1. **类加载依赖**: 反编译的类必须能被类加载器找到,否则报`ClassNotFoundException`(通过`-classpath`解决)[^2] 2. **版本兼容性**: 使用与编译版本匹配的JDK执行`javap`,避免字节码版本差异 3. **Lambda表达式**: Lambda生成的匿名类需通过`javap -c -p -v`查看完整信息(显示`private static`方法) > **输出解读技巧**: > - `descriptor`: 字段/方法签名(JNI关键) > - `Code`: 字节码指令(`iload`, `iadd`等) > - `Stack=2, Locals=4`: 操作数栈深度和局部变量槽数量[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值