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 精准一次。好!!! 如何区分只要盯准提交位移、消费消息这两个动作的时机就可以了。 当:先消费消息、…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
