下载,解压
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