javap 工具的介绍
[size=medium]javap 是jdk 自带的一个工具,可以反编译,也可以查看java编辑器生成的字符码,是分析代码的一个好的工具。
要分解class文件,方法:javap [option] class(没有后缀)
option:
-help 帮助;
-l 输出行和变量的表,在这个步骤之前需要运行命令 javac -g class.java,得到javap -l calss 所需要的参数;详见javac-public 只输出public方法和域;
-protected 只输出public和protected类和成员;
-package 只输出包,public 和protected 类和成员,这是默认的;
-private 输出所有类和成员;
-s 输出内部类型签名;
-c 输出分解后的代码,例如,类中每一个方法内,包含java字符码的指令;
-verbose 输出栈大小,方法参数的个数;
例1:
public class JavapCTest{/** * @param args */public static void main(String[] args){int i = 2;int j = 3;}}[color=violet] 0: iconst_2 //把2放到栈顶 1: istore_1 //把栈顶的值放到局部变量1中,即i中 2: iconst_3 //把3放到栈顶 3: istore_2 //把栈顶的值放到局部变量2中,即j中 4: return[/color]
public class Difficult { public static void main(String[] args) { int i=2; i=i++; int j=i++; System.out.println(i+":"+j); }}[color=violet]0: iconst_2 //将常数2压入栈中:21: istore_1 //将栈顶的元素pop出,存入局部变量索引为1的位置:(栈中元素为空)2: iload_1 //将局部变量索引为1的int压入栈:23: iinc 1, 1 //将局部变量索引为1的值加1:26: istore_1 //pop栈顶元素,将其存储到局部变量索引为1的位置:(栈中元素为空)7: iload_1 //将局部变量索引为1的int压入栈:28: iinc 1, 1 //将局部变量索引为1的值加1:211: istore_2 //pop栈顶元素,将其存入局部变量索引为2的位置:(栈中元素为空)12: return //返回:(栈中元素为空)[/color]
public class ByteCodeDemo {public static void main(String[] args) {System.out.println("Hello world");}}public class ByteCodeDemo extends java.lang.Object { public ByteCodeDemo(); public static void main(java.lang.String[]);}Method ByteCodeDemo()0 aload_01 invokespecial #1 <Method java.lang.Object()>4 returnMethod void main(java.lang.String[])0 getstatic #2 <Field java.io.PrintStream out>3 ldc #3 <String "Hello world">5 invokevirtual #4 <Method void println(java.lang.String)>8 return