目錄
一. 前言
二. 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 之 字節碼指令》。