jdk-javap

  18 Jun 2017


下载,解压

tar zxvf jdk-8u5-linux-i586.gz  -C /data/client/jdk1.8

linux下java环境变量设置

vim /etc/profile文件添加(全局)

export JAVA_HOME=/data/client/jdk1.8
export PATH=$JAVA_HOME/bin:$PATH
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

vim .bashrc 文件

export JAVA_HOME=/data/client/jdk1.8
export PATH={JAVA_HOME}/bin:$PATH
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

source .bashrc

更新默认jdk

update-alternatives --install /usr/bin/java java /data/jdk1.8/bin/java 300
update-alternatives --install /usr/bin/javac javac /data/jdk1.8/bin/javac 300
update-alternatives –config java

javap命令

javap是 Java class文件分解器,可以反编译,也可以查看java编译器生成的字节码。用于分解class文件。

用法: javap <options> <classes>
  -help  --help  -?        输出此用法消息
  -version                 版本信息
  -v  -verbose             输出附加信息
  -l                       输出行号和本地变量表
  -public                  仅显示公共类和成员
  -protected               显示受保护的/公共类和成员
  -package                 显示程序包/受保护的/公共类
                           和成员 (默认)
  -p  -private             显示所有类和成员
  -c                       对代码进行反汇编
  -s                       输出内部类型签名
  -sysinfo                 显示正在处理的类的
                           系统信息 (路径, 大小, 日期, MD5 散列)
  -constants               显示静态最终常量
  -classpath <path>        指定查找用户类文件的位置
  -bootclasspath <path>    覆盖引导类文件的位置
  

Dos命令:
    javac Test.java 编译
    javap -c Test  反编译

eclipse使用javap

1. Run->External Tools->External Tools Configurations->Program邮件new
2. name:javap
   Loaction:javap路径(jkd下bin下javap.exe) 
   Working Directory:${workspace_loc:/${project_name}}
   Aruments:-classpath  target/classes -c ${java_type_name}
3. java文件选中下,运行Run javap即可

javap反编译

public class Test1 {
	public static int main(String[] args) {
		int a = 10;
		int b = 20;
		
		int c = a + b;
		return c;
	}
}

Compiled from "Test.java"
public class com.javap.Test1 {
  public com.javap.Test1();
    Code:
       0: aload_0
       1: invokespecial #8                  // Method java/lang/Object."<init>":()V
       4: return

  public static int main(java.lang.String[]);
    Code:
       0: bipush        10	// 10入栈
       2: istore_1			// 出栈,放到第二个变量中,即a(第一个变量是this)
       3: bipush        10	// 10入栈
       5: istore_2			// 出栈,放到第三个变量中,即b
       6: iload_1			// 将第一个变量入栈,即a
       7: iload_2			// 将第二个变量入栈,即b
       8: iadd				// 弹出栈顶值2个值,并进行add操作,把add结果再入栈
       9: istore_3			// 出栈,放到第四个变量中,即c
      10: iload_3			// 将第三个变量入栈,即c
      11: ireturn			// 结束
}

栈指令

1. int取值1-5时,jvm采用iconst_0到iconst_5指令将常量压入栈
2. int取值-1时采用iconst_m1指令将常量压入栈
3. int取值-128-127时采用bipush指令将常量压入栈
4. aconst_null将null指针入栈
5. istore_n出栈,放到第n+1个变量中(0代表第一个变量,为this)
6. iload_x将变量入栈
7. iadd弹出栈顶2个值,相加,并将结果入栈
...

http://kingj.iteye.com/blog/1451008
http://www.cnblogs.com/tenghoo/p/jvm_opcodejvm.html
https://yq.aliyun.com/articles/7242