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 精准一次。好!!! 如何区分只要盯准提交位移、消费消息这两个动作的时机就可以了。 当:先消费消息、…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
