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 之 字節碼指令》。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164214.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164214.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164214.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Modbus RTU協議及modbus庫函數使用

一、與Modbus TCP的區別 在一般工業場景使用modbus RTU的場景還是更多一些&#xff0c;modbus RTU基于串行協議進行收發數據&#xff0c;包括RS232/485等工業總線協議。 與modbus TCP不同的是RTU沒有報文頭MBAP字段&#xff0c;但是在尾部增加了兩個CRC檢驗字節&#xff08;CRC…

Android之在RecyclerView列表中實現單選

一、實現效果 單選、可取消選中、列表數據可更新&#xff08;選擇狀態清空&#xff0c;可重新選擇&#xff09; RecyclerView列表單選 二、實現步驟 僅展示部分核心代碼&#xff0c;請主要參考適配器的定義 1、Item布局 selected_tip_list_item.xml文件 包含一個TextView和…

Spring Boot集成MyBatis實現多數據源訪問的“秘密”

文章目錄 為什么需要多數據源&#xff1f;Spring Boot集成MyBatis的基礎配置使用多數據源小結 &#x1f389;Spring Boot集成MyBatis實現多數據源訪問的“秘密” ☆* o(≧▽≦)o *☆嗨~我是IT陳寒&#x1f379;?博客主頁&#xff1a;IT陳寒的博客&#x1f388;該系列文章專欄&…

力扣:178. 分數排名(Python3)

題目&#xff1a; 表: Scores ---------------------- | Column Name | Type | ---------------------- | id | int | | score | decimal | ---------------------- 在 SQL 中&#xff0c;id 是該表的主鍵。 該表的每一行都包含了一場比賽的分數。Score …

TCP /UDP協議的 socket 調用的過程

在傳輸層有兩個主流的協議 TCP 和 UDP&#xff0c;socket 程序設計也是主要操作這兩個協議。這兩個協議的區別是什么呢&#xff1f;通常的答案是下面這樣的。 TCP 是面向連接的&#xff0c;UDP 是面向無連接的。TCP 提供可靠交付&#xff0c;無差錯、不丟失、不重復、并且按序…

Selenium介紹及基本使用方法

Selenium是一個開源、免費、簡單、靈活&#xff0c;對Web瀏覽器支持良好的自動化測試工具&#xff0c;在UI自動化、爬蟲等場景下是十分實用的&#xff0c;能夠熟練掌握并使用Selenium工具可以大大的提高效率。 Selenium簡介 Selenium支持多平臺、多瀏覽器、多語言去實現自動化…

深入理解強化學習——馬爾可夫決策過程:動作價值函數

分類目錄&#xff1a;《深入理解強化學習》總目錄 不同于馬爾可夫獎勵過程&#xff0c;在馬爾可夫決策過程中&#xff0c;由于動作的存在&#xff0c;我們額外定義一個動作價值函數&#xff08;Action-value Function&#xff09;。我們用 Q π ( s , a ) Q^\pi(s, a) Qπ(s,a)…

線程提交線程到線程池,有幾種方式,哪一種方式是工作中不能使用的,無法捕捉異常,線程池的拒絕策略,線程池的提交方式

線程池的工作原理 JDK中提交線程到線程池&#xff0c;有幾種方式&#xff0c;哪一種方式是工作中不能使用的&#xff0c;無法捕捉異常 兩種提交任務的方法 ExecutorService 提供了兩種提交任務的方法&#xff1a; execute()&#xff1a;提交不需要返回值的任務 submit()&a…

【C語言】多組輸入

C系列文章目錄 目錄 C系列文章目錄 一、什么是多組輸入&#xff1f; 二、如何使用多組輸入 2.1&#xff0c;試題舉例講解 2.2&#xff0c;錯誤解法 2.3&#xff0c;我們實現多組輸入的思路 2.4&#xff0c;第一種正確的解法 2.5&#xff0c;第二種正確的解法 2.6&…

Python入門教程 | Python3 字典(dict)

Python3 字典 字典是另一種可變容器模型&#xff0c;且可存儲任意類型對象。 Python3中的字典是一種無序、可變、可迭代的數據結構&#xff0c;它由鍵&#xff08;key&#xff09;和對應的值&#xff08;value&#xff09;組成。字典在Python中被視為可變對象&#xff0c;這意…

ES ElasticSearch安裝、可視化工具kibana安裝

1、安裝ES docker run -d --name es9200 -e "discovery.typesingle-node" -p 9200:9200 elasticsearch:7.12.1訪問測試&#xff1a; http://域名:9200/ 2、安裝kibana對es進行可視化操作 執行命令 docker run -d --name kibana5601 -p 5601:5601 kibana:7.1.12.修…

如何實現在公網下使用navicat圖形化工具遠程連接本地內網的MariaDB數據庫

公網遠程連接MariaDB數據庫【cpolar內網穿透】 文章目錄 公網遠程連接MariaDB數據庫【cpolar內網穿透】1. 配置MariaDB數據庫1.1 安裝MariaDB數據庫1.2 測試局域網內遠程連接 2. 內網穿透2.1 創建隧道映射2.2 測試隨機地址公網遠程訪問3. 配置固定TCP端口地址3.1 保留一個固定的…

Redis深入理解-Socket連接建立流程以及文件事件處理機制

Redis Server 運行原理圖 Redis 服務器中 Socket 網絡建立以及文件事件模型 一個 redis 單機&#xff0c;可以抗幾百上千的并發&#xff0c;這里的并發指的就是同時可以有幾百個 client 對這個 redis server 發起請求&#xff0c;都需要去建立網絡連接&#xff0c;同時間可能會…

利用 docker 實現JMeter分布式壓測

為什么需要分布式&#xff1f; 在工作中經常需要對一些關鍵接口做高QPS的壓測&#xff0c;JMeter是由Java 語言開發&#xff0c;沒創建一個線程&#xff08;虛擬用戶&#xff09;&#xff0c;JVM默認會為每個線程分配1M的堆棧內存空間。受限于單臺試壓機的配置很難實現太高的并…

YAML 深入解析:從語法到最佳實踐

什么是YAML YAML&#xff08;YAML Ain’t Markup Language&#xff09;是一種人類可讀的數據序列化語言。它的設計目標是使數據在不同編程語言之間交換和共享變得簡單。YAML采用了一種簡潔、直觀的語法&#xff0c;以易于閱讀和編寫的方式表示數據結構。 YAML廣泛應用于配置文…

【OpenCV實現圖像:制作酷炫的動畫效果】

文章目錄 概要生成背景圖添加點動畫添加文本顯示小結 概要 首先&#xff0c;通過導入必要的庫&#xff0c;包括NumPy用于數學運算和Matplotlib庫用于數據可視化。隨后&#xff0c;創建圖形和軸&#xff0c;初始化點的位置&#xff0c;以及編寫初始化函數和更新函數。 初始化函…

C語言歸并排序

以夢為馬&#xff0c;不負韶華 文章目錄 引入&#xff1a;實現原理問題引出&#xff1a;遞歸實現&#xff1a;迭代實現穩定性分析&#xff1a;總結&#xff1a; 引入&#xff1a; 如何將兩個有序數組&#xff08;假設為升序&#xff09;合并為一個有序數組&#xff1f; 雙指針…

yolov5/v7修改標簽和檢測框顯示【最全】

《記錄自己在使用yolov5遇到的一些問題》同時也供大家參考&#xff0c;如果對你們有幫助&#xff0c;希望大家可以給個點贊、收藏鼓勵下&#xff0c;非常感謝&#xff01; 以自帶的一張圖片作為示例,yolov5(6.1版本)的初始檢測框應該是如下圖所示 修改線條粗細、隱藏標簽、隱…

EI論文故障識別程序:DBN深度置信/信念網絡的故障識別Matlab程序,數據由Excel導入,直接運行!

?適用平臺&#xff1a;Matlab2021b版及以上 本程序參考中文EI期刊《基于變分模態分解和改進灰狼算法優化深度置信網絡的自動轉換開關故障識別》中的深度置信網絡&#xff08;Deep Belief Network&#xff0c;DBN&#xff09;部分進行故障識別&#xff0c;程序注釋清晰&#x…

Python之學生信息管理系統

目錄 一、基礎界面實現 1、主函數 2、保持循環&#xff0c;獲取用戶需求 二、函數實現模塊功能 1、添加學生信息 2、刪除學生信息 3、修改學生信息 4、查找全部學生信息 5、退出系統 三、整合代碼 1、 完整代碼 2、完整實現過程 實現 打印功能菜單、添加學生信息、刪…