java javac javap
java
help
java -help
用法: java [-options] class [args...]
(执行类)
或 java [-options] -jar jarfile [args...]
(执行 jar 文件)
其中选项包括:
-d32 使用 32 位数据模型 (如果可用)
-d64 使用 64 位数据模型 (如果可用)
-server 选择 "server" VM
默认 VM 是 server.
-cp <目录和 zip/jar 文件的类搜索路径>
-classpath <目录和 zip/jar 文件的类搜索路径>
用 ; 分隔的目录, JAR 档案
和 ZIP 档案列表, 用于搜索类文件。
-D<名称>=<值>
设置系统属性
-verbose:[class|gc|jni]
启用详细输出
-version 输出产品版本并退出
-version:<值>
警告: 此功能已过时, 将在
未来发行版中删除。
需要指定的版本才能运行
-showversion 输出产品版本并继续
-jre-restrict-search | -no-jre-restrict-search
警告: 此功能已过时, 将在
未来发行版中删除。
在版本搜索中包括/排除用户专用 JRE
-? -help 输出此帮助消息
-X 输出非标准选项的帮助
-ea[:<packagename>...|:<classname>]
-enableassertions[:<packagename>...|:<classname>]
按指定的粒度启用断言
-da[:<packagename>...|:<classname>]
-disableassertions[:<packagename>...|:<classname>]
禁用具有指定粒度的断言
-esa | -enablesystemassertions
启用系统断言
-dsa | -disablesystemassertions
禁用系统断言
-agentlib:<libname>[=<选项>]
加载本机代理库 <libname>, 例如 -agentlib:hprof
另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help
-agentpath:<pathname>[=<选项>]
按完整路径名加载本机代理库
-javaagent:<jarpath>[=<选项>]
加载 Java 编程语言代理, 请参阅 java.lang.instrument
-splash:<imagepath>
使用指定的图像显示启动屏幕
有关详细信息, 请参阅 http://www.oracle.com/technetwork/java/javase/documentation/index.html。
example
-version
java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
run main method
java IntegerTest
当我们使用java命令运行一个.class文件,需要使用该类的全限定类名和在当前路径下有该类的包层次目录。这就要求编译时使用javac -d 参数。否则需要自己来建立包层次目录。
如
javac -encoding UTF-8 -d . IntegerTest.java
java com/james/example/IntegerTest
javac
javac是用来编译.java文件为.class文件的指令
help
javac -help
用法: javac <options> <source files>
其中, 可能的选项包括:
-g 生成所有调试信息
-g:none 不生成任何调试信息
-g:{lines,vars,source} 只生成某些调试信息
-nowarn 不生成任何警告
-verbose 输出有关编译器正在执行的操作的消息
-deprecation 输出使用已过时的 API 的源位置
-classpath <路径> 指定查找用户类文件和注释处理程序的位置
-cp <路径> 指定查找用户类文件和注释处理程序的位置
-sourcepath <路径> 指定查找输入源文件的位置
-bootclasspath <路径> 覆盖引导类文件的位置
-extdirs <目录> 覆盖所安装扩展的位置
-endorseddirs <目录> 覆盖签名的标准路径的位置
-proc:{none,only} 控制是否执行注释处理和/或编译。
-processor <class1>[,<class2>,<class3>...] 要运行的注释处理程序的名称; 绕过默认的搜索进程
-processorpath <路径> 指定查找注释处理程序的位置
-parameters 生成元数据以用于方法参数的反射
-d <目录> 指定放置生成的类文件的位置
-s <目录> 指定放置生成的源文件的位置
-h <目录> 指定放置生成的本机标头文件的位置
-implicit:{none,class} 指定是否为隐式引用文件生成类文件
-encoding <编码> 指定源文件使用的字符编码
-source <发行版> 提供与指定发行版的源兼容性
-target <发行版> 生成特定 VM 版本的类文件
-profile <配置文件> 请确保使用的 API 在指定的配置文件中可用
-version 版本信息
-help 输出标准选项的提要
-A关键字[=值] 传递给注释处理程序的选项
-X 输出非标准选项的提要
-J<标记> 直接将 <标记> 传递给运行时系统
-Werror 出现警告时终止编译
@<文件名> 从文件读取选项和文件名
example
-encoding
javac -encjavaoding UTF-8 -d . IntegerTest.java
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
java com/james/example/IntegerTest
javap
javap是JDK自带的反汇编器,查看java编译器为我们生成的字节码。 -c 对代码进行反汇编
help
javap -help
用法: javap <options> <classes>
其中, 可能的选项包括:
-help --help -? 输出此用法消息
-version 版本信息
-v -verbose 输出附加信息
-l 输出行号和本地变量表
-public 仅显示公共类和成员
-protected 显示受保护的/公共类和成员
-package 显示程序包/受保护的/公共类
和成员 (默认)
-p -private 显示所有类和成员
-c 对代码进行反汇编
-s 输出内部类型签名
-sysinfo 显示正在处理的类的
系统信息 (路径, 大小, 日期, MD5 散列)
-constants 显示最终常量
-classpath <path> 指定查找用户类文件的位置
-cp <path> 指定查找用户类文件的位置
-bootclasspath <path> 覆盖引导类文件的位置
example
public class MyIntegerTest {
public static void main(String[] args) {
int a = 1;
int b = 2;
int c = a + b;
System.out.println(c);
}
}
-p
javac -encoding UTF-8 MyIntegerTest.java
javap -p MyIntegerTest
警告: 二进制文件MyIntegerTest包含com.james.example.MyIntegerTest
Compiled from "MyIntegerTest.java"
public class com.james.example.MyIntegerTest {
public com.james.example.MyIntegerTest();
public static void main(java.lang.String[]);
}
-c
javac -encoding UTF-8 MyIntegerTest.java
javap -c MyIntegerTest
警告: 二进制文件MyIntegerTest包含com.james.example.MyIntegerTest
Compiled from "MyIntegerTest.java"
public class com.james.example.MyIntegerTest {
public com.james.example.MyIntegerTest();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: invokestatic #2 // Method test:()I
3: istore_1 // 将操作数栈顶的整数值(test()方法的返回值)出栈并存入局部变量表的第一个Slot中
4: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
7: iload_1 // 将局部变量表中的第一个Slot中的整型值复制到操作数栈顶
8: invokevirtual #4 // Method java/io/PrintStream.println:(I)V
11: return
public static int test();
Code:
0: iconst_1 // 将常量1压入操作数栈
1: istore_1 // 将操作数栈顶的整型值出栈并存放入局部变量表中的第一个Slot中
2: iconst_2 // 将常量2压入操作数栈
3: istore_2 // 将操作数栈顶的整型值出栈并存放入局部变量表中的第二个Slot中
4: iload_1 // 将局部变量表中的第一个Slot中的整型值复制到操作数栈顶
5: iload_2 // 将局部变量表中的第二个Slot中的整型值复制到操作数栈顶
6: iadd // 将操作数栈中头两个栈顶元素出栈,做整型的加法,然后将结果重新入操作数栈
7: istore_2 // 将操作数栈顶的整型值出栈并存放入局部变量表中的第三个Slot中
8: iload_2 // 将局部变量表中的第三个Slot中的整型值复制到操作数栈顶
9: ireturn // 将操作数栈中的栈顶值返回给此方法的调用者
}
当int取值-1-5采用iconst指令,取值-128-127采用bipush指令,取值-32768-32767采用sipush指令,取值-2147483648~2147483647采用 ldc 指令。