目录
[一. 前言](#一. 前言)
[二. javac 命令](#二. javac 命令)
[三. java 命令](#三. java 命令)
[四. javap 命令](#四. javap 命令)
一. 前言
在日常工作中,我们新建 Java工程,写好代码后,编译和运行几乎都是通过 IDE(如idea、eclipse)工具完成。但作为 Java开发者还是要了解下 Java虚拟机指令。通过 javac 和 java 执行编译 Java文件和运行class以及jar文件,通过 javap 命令查看编译后的Java字节码。
二. javac 命令
javac 是 Java 编程语言的编译器,它是 Java Development Kit(JDK)的一部分。javac 命令用于将 Java 源代码文件(扩展名为 .java)编译成 Java 字节码文件(扩展名为 .class),这些字节码文件随后可以由 Java 虚拟机 (JVM) 执行。
了解 javac 的这些方面对于 Java 开发者来说是很重要的,因为它是 Java 开发过程中的基本工具之一。通过有效地使用 javac,开发者可以确保他们的 Java 程序被正确编译,且在目标 Java 虚拟机上运行无误。
java
// 命令格式
javac [options] [sourcefiles] [classes] [args]
options 选项如下:
选项 | 含义 |
---|---|
-d 目录 | 指定编译器输出 .class 文件的目标目录。如果目录不存在,javac 将尝试创建它。 |
-classpath 或 -cp 路径 | 设置查找类文件和注释处理器的路径。 |
-sourcepath 路径 | 指定查找输入源文件的位置。 |
-target 版本 | 指定生成特定版本的 Java VM 的类文件。例如,如果想生成与 Java 8 兼容的类文件,可以使用 -target 1.8。 |
-source 版本 | 提供与 -target 选项相对应的源代码的版本支持。 |
-g | 生成所有调试信息,包括局部变量的信息。 |
-Xlint | 提供对源代码的更全面检查,报告更多警告和潜在的问题。 |
-encoding 编码 | 指定源文件使用的字符编码,例如 UTF-8。 |
-bootclasspath 路径 | 覆盖引导类文件的位置。这在与非标准的 Java 运行时环境(JRE)一起使用时特别有用。 |
-processor | 指定要使用的注释处理器的名称。 |
-J 选项 | 直接将选项传递给 JVM。 |
错误处理:
当源代码中有语法或语义错误时,javac 会报告这些错误,并在可能的情况下给出修改建议。
编译错误必须修正才能成功编译程序。
版本:
javac 的行为和可用选项可能会根据 JDK 的版本略有不同。建议查看使用的 JDK 版本的官方文档了解具体细节。
使用场景:
javac 通常在命令行环境中使用,但也可以在集成开发环境 (IDE) 如 Eclipse 或 IntelliJ IDEA 中间接使用。
三. java 命令
java 命令用来运行 class文件。注意:不能带 .class 后缀!文件夹之间用句点,而非斜杠。
java
java [-options] class [args...]
// class 为执行类
// 或者
java [-options] -jar jarfile [args...]
// jar 为可执行 jar 文件
options: 为Java命令选项,可选参数。
class: 为要运行的主类的名称,必需参数。
**args:**为传入主类的参数,可选参数。用空格隔开。例如,java org.example.Demo a 1 bc 23。
options 选项如下:
选项 | 含义 |
---|---|
-d32 | 使用 32 位数据模型 (如果可用) |
-d64 | 使用 64 位数据模型 (如果可用) |
-server | 选择 "server" VM。默认 VM 是 server。 |
-cp <目录和 zip/jar 文件的类搜索路径> | 目录和 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。
注意:使用 java -jar xxx.jar 命令时,无法同时使用 -cp 选项。
四. javap 命令
javap 是 Java Development Kit(JDK)中的一个命令行工具,它被用作 Java 类文件的反汇编程序。这意味着可以使用 javap 来查看编译后的 Java 字节码,或者更具体地说,查看 .class 文件中的信息。这对于理解 Java 字节码、调试、以及学习 Java 编译器如何工作非常有帮助。
java
// 用法
javap <options> <classes>
options: 为Javap命令选项,可选参数。
**classes:**为要查看的类的名称,必需参数。注意,不需要指定 .class 扩展名。
options 选项如下:
选项 | 含义 |
---|---|
-help --help -? | 输出此用法消息 |
-version | 版本信息 |
-v -verbose | 输出附加信息 |
-l | 输出行号和本地变量表 |
-public | 仅显示公共类和成员 |
-protected | 显示受保护的/公共类和成员 |
-package | 显示程序包/受保护的/公共类和成员 (默认) |
-p -private | 显示所有类和成员 |
-c | 对代码进行反汇编 |
-s | 输出内部类型签名 |
-sysinfo | 显示正在处理的类的系统信息 (路径, 大小, 日期, MD5 散列) |
-constants | 显示最终常量 |
-classpath <path> | 指定查找用户类文件的位置 |
-cp <path> | 指定查找用户类文件的位置 |
-bootclasspath <path> | 覆盖引导类文件的位置 |
注意事项:
-
javap 仅提供对字节码的静态分析。它不能告诉我们程序的运行时行为。
-
对于使用高级功能(如泛型)的代码,反汇编的结果可能不易于理解,因为这些结构在字节码中有不同的表示。关于字节码的相关知识请参见《JVM 之 字节码指令》。