JVM 之 javac、java、javap 命令详解

目录

[一. 前言](#一. 前言)

[二. 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> 覆盖引导类文件的位置

注意事项:

  1. javap 仅提供对字节码的静态分析。它不能告诉我们程序的运行时行为。

  2. 对于使用高级功能(如泛型)的代码,反汇编的结果可能不易于理解,因为这些结构在字节码中有不同的表示。关于字节码的相关知识请参见《JVM 之 字节码指令》

相关推荐
XiaoLeisj1 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck1 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei1 小时前
java的类加载机制的学习
java·学习
Yaml43 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~3 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616883 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
aloha_7894 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
记录成长java4 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
睡觉谁叫~~~4 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust
程序媛小果5 小时前
基于java+SpringBoot+Vue的旅游管理系统设计与实现
java·vue.js·spring boot