javap反编译java字节码⽂件
概述:
javap是 Java class⽂件分解器,可以反编译,也可以查看java⽣成的字节码,从⽽对代码内部的执⾏逻辑进⾏分析。
语法:
把java⽂件编译为class⽂件:javac Test.java (Test.java为java⽂件名) ⽣成对应的 .class ⽂件 Test.class
执⾏javap操作:javap 命令⾏ class⽂件名称(不加 .class后缀)
例如: javap -c Test
命令⾏
-help 输出 javap 的帮助信息。
-l 输出⾏及局部变量表。
-b 确保与 JDK 1.1 javap 的向后兼容性。
-public 只显⽰ public 类及成员。
-protected 只显⽰ protected 和 public 类及成员。
-package 只显⽰包、protected 和 public 类及成员。这是缺省设置。
-private 显⽰所有类和成员。
-J[flag] 直接将 flag 传给运⾏时系统。
-s 输出内部类型签名。
-c 输出类中各⽅法的未解析的代码,即构成 Java 字节码的指令。
-verbose 输出堆栈⼤⼩、各⽅法的 locals 及 args 数,以及class⽂件的编译版本
-classpath[路径] 指定 javap ⽤来查类的路径。如果设置了该选项,则它将覆盖缺省值或 CLASSPATH 环境变量。⽬录⽤冒号分隔。
- bootclasspath[路径] 指定加载⾃举类所⽤的路径。缺省情况下,⾃举类是实现核⼼ Java 平台的类,位于 jrelibt.jar 和
jrelibi18n.jar 中。
-extdirs[dirs] 覆盖搜索安装⽅式扩展的位置。扩展的缺省位置是 jrelibext。
⽰例:
⼀个Demo.java⽂件(存放在桌⾯)
class Demo
{
public static void main(String[] args)
{
Integer aInteger = 56;
int aInt=0;
int aInt2 = 123;
String s="helloworld";
String aString = new String("IamString");
}
}
执⾏命令⾏操作
java valueof反汇编结果
Compiled from "Demo.java"
class Demo {
Demo();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: bipush 56
2: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 5: astore_1
6: iconst_0
7: istore_2
8: bipush 123
10: istore_3
11: ldc #3 // String helloworld
13: astore 4
15: new #4 // class java/lang/String
18: dup
19: ldc #5 // String IamString
21: invokespecial #6 // Method java/lang/String."<init>":(Ljava/lang/String;)V 24: astore 5
26: return
}
对其中的语法不清楚啊?可以参照⼀下这两篇博客:
javap -c 命令详解
JVM字节码之整型⼊栈指令(iconst、bipush、sipush、ldc)
如果还不清楚,放⼤招了:
ORACLE 官⽅⽂档 Chapter 4. The class File Format
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论