java有用编译指令

类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,所以没有打印。

你可能感兴趣的:(java,jvm,C++,c,C#)