JVM 之 javac、java、javap 命令详解
目录
一. 前言
二. javac 命令
三. java 命令
四. 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 虚拟机上运行无误。
// 命令格式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 [-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 编译器如何工作非常有帮助。
// 用法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 之 字节码指令》。
相关文章:
JVM 之 javac、java、javap 命令详解
目录 一. 前言 二. javac 命令 三. java 命令 四. javap 命令 一. 前言 在日常工作中,我们新建 Java工程,写好代码后,编译和运行几乎都是通过 IDE(如idea、eclipse)工具完成。但作为 Java开发者还是要了解下 Java虚…...
市场被套牢,没有了解积累和分配,昂首资本一一介绍
很多投资者对市场中的积累和分配的概念不是很清楚,下面昂首资本将一一介绍。 积累意味着尽可能多地买入筹码,而不大幅抬高价格,直到在你买入时的价格水平上没有或几乎没有筹码。这种买入通常发生在市场熊市之后,此时有最佳买入价…...
notion 3.0.0 版本最新桌面端汉化教程,支持MAC和WIN版本
notion客户端汉化(目前版本3.0.0) 最近notion桌面端更新了3.0.0版本后会导致老版本汉化失效,本项目实现了最新版Notion桌面端的汉化。 文件下载地址:汉化文件下载地址 项目说明 本项目针对新的客户端做了汉化文化,依…...
mysql union 和 union all区别?
在MySQL中,UNION和UNION ALL都是用于合并两个或多个SELECT语句的结果集。它们之间的主要区别在于如何处理重复记录。 UNION:UNION在合并结果集时会删除重复的记录。这意味着如果两个SELECT语句的输出结果中有相同的记录,那么UNION只会保留其中一个。在执…...
uni-app小程序 swiper 分页器样式修改
小程序中使用 wx-swiper-dot和wx-swiper-dot-active选择器 H5中使用uni-swiper-dot和uni-swiper-dot-active选择器 .swiper {height: 408px;margin-bottom: 28rpx;::v-deep .uni-swiper-dot {background: #e7e7e7;&.uni-swiper-dot-active {background: #b1b1b1;}}// #ifde…...
2023.11.23使用flask实现在指定路径生成文件夹操作
2023.11.23使用flask实现在指定路径生成文件夹操作 程序比较简单,实现功能: 1、前端输入文件夹 2、后端在指定路径生成文件夹 3、前端反馈文件夹生成状态 main.py from flask import Flask, request, render_template import osapp Flask(__name__)a…...
【Unity入门】Input.GetAxis(““)控制物体移动、旋转
使用Unity的Input.GetAxis(“”)控制物体移动、旋转 Input.GetAxis(“”) 是 Unity 引擎中的一个方法,用于获取游戏玩家在 键盘 或 游戏手柄 上输入的某个轴(Axis)的值。这里的 “” 是一个字符串参数,表示要获取的轴的名称。 在…...
【C++ 设计模式】面向对象设计原则 Template Method 模式 Strategy 策略模式
一、面向对象设计原则 重新认识面向对象 理解隔离变化 • 从宏观层面来看,面向对象的构建方式更能适应软件的变化, 能将变化所带来的影响减为最小 各司其职 • 从微观层面来看,面向对象的方式更强调各个类的“责任” • 由于需求变化导…...
Flink-简介与基础
Flink-简介与基础 一、Flink起源二、Flink数据处理模式1.批处理2.流处理3.Flink流批一体处理 三、Flink架构1.Flink集群2.Flink Program3.JobManager4.TaskManager 四、Flink应用程序五、Flink高级特性1.时间流(Time)和窗口(Window࿰…...
mobiusp 正在创作乐曲
题目描述 mobiusp 创作了一首 n 个音符的乐曲,其中第 iii 个音符的音高为 ai ,但是 mobiusp 对以前的创作风格和黑历史很不满意,他希望所有音符的音高 ai 都是 1∼7 的正整数,且相邻的音高差不超过 k 。 现在他要修改若干个音符…...
Jensen不等式
如果是正数,并且它们的和等于1,f是凸函数,那么: 也可表述为: 即x期望的凸函数值小于等于x凸函数值的期望...
北邮22级信通院数电:Verilog-FPGA(11)第十一周实验(2)设计一个24秒倒计时器
北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 1.1 counter_24.v 1.2 divid…...
什么是单元测试?
什么是单元测试 单元测试是软件开发中的一种测试方法,旨在验证各个软件组件或模块的功能正确性。在敏捷开发环境中,单元测试尤为重要,因为它有助于确保代码的质量和稳定性。下面是一些关于单元测试的关键点: 定义:单元…...
PTA-6-51(处理数组、字符串) 人口统计
题目: 本题运行时要求键盘输入10个人员的信息(每一个人信息包括:姓名,性别,年龄,民族),要求同学实现一个函数,统计民族是“汉族”的人数。 函数接口定义: pu…...
php中使用cdn
在 PHP 中使用 CDN 的一般流程如下: 1. 选择合适的 CDN 服务提供商:根据需求和预算选择合适的 CDN 服务提供商,例如阿里云CDN、腾讯云 CDN、Cloudflare 等。 2. 注册并配置 CDN 服务:在 CDN 服务提供商的网站上注册账号…...
docker部署MySQL5.7设置密码和远程访问的方法
运行MySQL docker run -p 3306:3306 --name mysql57 -v /root/mysql/log:/var/log/mysql -v /root/mysql/data:/var/lib/mysql -v /root/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORDD7txumqc2b! -d mysql:5.7 --character-set-serverutf8mb4 --collation-serverutf8…...
Vue组件基础
Vue组件基础是DOMDOMjs前端组成下的页面布局区域划分,每个组件展示时都要在页面上有一定的大小。每个设定好的页面区域都可以定义Vue的组件,组件中包含了HTML模板、样式、Vue组件对象的定义。Vue的组件是包含页面设计在内的,是一种为页面某个…...
Javascript每天一道算法题(十八)——矩阵置零-中等
文章目录 1、问题2、示例3、解决方法(1)方法1——标记数组 1、问题 给定一个 y x x 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 2、示例 示例 1: 输入:matrix [[…...
基于ROS开发的开源项目
基于ROS (Robot Operating System) 开发的开源项目很多,其中一些已经在机器人领域内非常知名。以下是一些比较著名的例子: Autoware: Autoware 是一个开源的自动驾驶车辆的软件栈,提供了从3D地图表示、环境感知(如障碍物、行人检测…...
kafka精准一次、事务、幂等性
Kafka事务 消息中间件的消息保障的3个级别 At most once 至多一次。数据丢失。At last once 至少一次。数据冗余Exactly one 精准一次。好!!! 如何区分只要盯准提交位移、消费消息这两个动作的时机就可以了。 当:先消费消息、…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
