类A:
public class Test{
public static void main(String[] arts){
byte[] o = new byte[0];
Object o1 = new Object();
}
}
编译指令
javac的主要作用是把java源代码转化成相应的jvm指令,另外还会帮我们做一些如添加构造默认构造函数的工作等等。
http://dreamhead.blogbus.com/logs/5999838.html
1,javac -d <目录> A.java
指定生成的A.class的位置
2,javac -verbose A.java
显示生成类文件时需要加载哪些类
反编译指令
javap可以帮助我们查看编译器生成的字节码与源代码的不同,以了解java编译器的工作原理
1,javap A(不带参数)
E:\Workspace>javap Test
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
public static void main(java.lang.String[]);
}
打印类的成员变量和方法,如果类没有显示的从其他类派生,则默认为从Object类继承。如果没有显示的构造函数,则编译器会生成一个缺省的构造函数。
2,javap -c A
E:\Workspace>javap -c Test
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: newarray byte
3: astore_1
4: new #2; //class java/lang/Object
7: dup
8: invokespecial #1; //Method java/lang/Object."<init>":()V
11: astore_2
12: return
}
显示了方法的具体字节码,例如:默认构造函数Test()调用了父类Object的构造函数。
3,javap -l A
E:\Workspace>javap -l Test
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
LineNumberTable:
line 1: 0
public static void main(java.lang.String[]);
LineNumberTable:
line 3: 0
line 4: 4
line 5: 12
}
显示了字节吗与源代码对应的信息,例如 line 3:0 表示源代码中的第三行对应与字节码中的 0: iconst_0,也就是源代码编译时指令的开始位置。
生成一个0长度的字节数组对象需要执行3条操作指令,生成一个Object对象需要执行7条操作指令。
4,javap -p A
E:\Workspace>javap -p Test
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
public static void main(java.lang.String[]);
}
额外地打印private成员和方法的信息。该类不存在private,所以没有打印。