導航和編輯 Java 原始碼
Visual Studio Code 首先是一個原始碼編輯器,具備豐富的編輯 功能。在本教程中,我們將介紹一些在處理 Java 時有用的特定於 Java 的功能。
如果您在使用以下功能時遇到任何問題,可以透過提交問題聯絡我們。
程式碼導航
透過 大綱檢視,您可以方便地導航當前檔案中的成員。專案檢視 也提供了對專案的整體概覽。作為 Java 編輯器,它還支援呼叫層次結構、型別層次結構、定義導航、工作區中的型別搜尋等。
搜尋符號
您可以搜尋當前檔案或工作區中的符號,以更快地導航程式碼。
搜尋工作區中的符號
要搜尋當前工作區中的符號,請按 ⌘T (Windows, Linux Ctrl+T),然後輸入符號的名稱。將出現潛在匹配項的列表。如果您選擇了一個在尚未開啟的檔案中找到的匹配項,該檔案將在導航到匹配項的位置之前被開啟。或者,您也可以使用 **快速開啟** (⌘P (Windows, Linux Ctrl+P)) 然後輸入 '#' 命令來搜尋當前工作區。⌘T (Windows, Linux Ctrl+T) 只是 '#' 命令的快捷方式,所以一切都一樣。
搜尋當前檔案中的符號
要搜尋當前檔案中的符號,請使用 **快速開啟** (⌘P (Windows, Linux Ctrl+P)),然後輸入 '@' 命令,接著輸入您要查詢的符號名稱。當您鍵入時,將出現並過濾潛在的匹配項列表。從匹配項列表中選擇以導航到其位置。
速覽定義
您可以使用“檢視定義”功能快速檢視符號的定義方式。此功能會在一個檢視視窗中顯示定義附近的幾行程式碼,因此您無需離開當前位置即可檢視。
要檢視符號的定義,請將游標放在原始碼中該符號的任何使用位置,然後按 ⌥F12 (Windows Alt+F12, Linux Ctrl+Shift+F10)。或者,您可以從上下文選單(右鍵單擊,然後選擇“檢視定義”)中選擇“檢視定義”。
轉到定義
您也可以使用“轉到定義”功能快速導航到符號的定義位置。
要轉到符號的定義,請將游標放在原始碼中該符號的任何使用位置,然後按 F12。或者,您可以從上下文選單(右鍵單擊,然後選擇“轉到定義”)中選擇“轉到定義”。當符號只有一個定義時,您將直接導航到其位置;否則,競爭的定義將顯示在檢視視窗中,如前一節所述,您必須選擇要轉到的定義。
轉到父實現
您可以透過單擊懸停時的“轉到父實現”連結來跟蹤類實現和重寫方法。

呼叫層次結構
呼叫層次結構檢視顯示了來自或到某個函式的全部呼叫,並允許您深入檢視呼叫者的呼叫者以及被呼叫的呼叫。右鍵單擊一個函式並選擇“檢視”>“檢視呼叫層次結構”。

您也可以在函式體中右鍵單擊並選擇“顯示呼叫層次結構”。

型別層次結構
型別層次結構檢視顯示了 Java 物件之間的繼承關係。您可以右鍵單擊一個型別並選擇“顯示型別層次結構”。
摺疊區域
摺疊區域允許您摺疊或展開程式碼片段,以便更好地檢視原始碼。
智慧選擇
藉助 智慧選擇(語義選擇),您可以根據原始碼中插入點位置的語義資訊來擴充套件或收縮選區。
- 要擴充套件選區,請使用 ⌃⇧⌘→ (Windows, Linux Shift+Alt+Right)。
- 要收縮選區,請使用 ⌃⇧⌘← (Windows, Linux Shift+Alt+Left)。
語義高亮
語法高亮是一項重要功能,可讓您更有效地閱讀程式碼。藉助 語義高亮,VS Code 可以根據 Java 語言服務的符號資訊提供更準確的原始碼著色。
下面是一個例子,左側是啟用語義高亮後的行為,右側是僅有語法高亮時的行為。

您可以在 Java Language Support 擴充套件 wiki 上了解有關 Java 語義高亮的更多詳細資訊。
使用 Spring Boot 導航程式碼
該 Spring Boot Tools 擴充套件為 Spring Boot 專案提供了增強的導航和程式碼補全支援。
@/顯示所有定義的請求對映(對映路徑、請求方法、源位置)@+顯示所有定義的 Bean(Bean 名稱、Bean 型別、源位置)@>顯示所有函式(原型實現)@顯示程式碼中的所有 Spring 註釋

要了解有關 Visual Studio Code 的 Spring Boot 支援的更多資訊,請閱讀 Visual Studio Code 中的 Spring Boot。
程式碼編輯
藉助 IntelliSense 進行智慧程式碼補全和簽名詳細資訊,程式碼編輯也變得輕鬆。您可以使用程式碼片段以及各種程式碼操作(如生成 Getters/Setters 和組織匯入)來進一步提高您的工作效率。
Visual Studio Code 中的 Java 支援會自動檢測程式碼中的問題,併為您提供快速修復建議。
有關重構和程式碼操作的更多詳細資訊,請參閱 重構和原始碼操作。
IntelliSense
Visual Studio Code 中 Java 的程式碼補全由 Language Support for Java™ by Red Hat 提供。該擴充套件由 Eclipse 背後的 Java Development Tools (JDT) 提供支援,因此您可以期待相同級別的支援。
此外,還有一種稱為 IntelliCode 的 AI 輔助 IntelliSense。它透過將最可能使用的內容放在補全列表的頂部來節省您的時間。IntelliCode 的建議基於 GitHub 上數千個獲得 100 顆以上星標的開源專案,因此它是在最常見的用法中經過訓練的。當與程式碼的上下文結合時,補全列表會經過定製,以推廣這些實踐。以下是 IntelliCode for Java 的實際應用。
IntelliCode 與 Java SE 和 Spring 等流行的 Java 庫和框架配合良好。無論您是構建單體 Web 應用還是現代微服務,它都會為您提供幫助。
建立新檔案
VS Code 支援在建立 Java 原始檔時應用模板。當您在檔案資源管理器中建立 .java 檔案時,語言伺服器會自動生成類主體,併為您填充包資訊。
程式碼片段
Visual Studio Code 支援各種流行的 Java 程式碼片段,讓您更高效,例如類/介面、syserr、sysout、if/else、try/catch、static main 方法。利用 Java 語言伺服器的資訊,它還在選擇過程中提供程式碼片段的預覽。
例如,鍵入“**sout**”或“**sysout**”將生成 System.out.println() 的程式碼片段。
同樣,鍵入“**main**”或“**psvm**”將生成 public static void main(String[] args) {} 的程式碼片段。

完整的快捷方式列表如下
程式碼片段快捷方式
| 快捷鍵 | 描述 |
|---|---|
| ctor | 公共建構函式 |
| dowhile | Do-while 語句 |
| foreach, iter | 遍歷陣列或 Iterable |
| fori | 遍歷陣列 |
| if | If 語句 |
| ifelse | If-else 語句 |
| ifnull | 檢查 null 的 If 語句 |
| ifnotnull | 檢查非 null 的 If 語句 |
| main, psvm | 公共靜態 main 方法 |
| new | 建立新物件 |
| private_method | 私有方法 |
| private_static_method | 私有靜態方法 |
| prf | 私有欄位 |
| protected_method | 保護方法 |
| public_method | 公共方法 |
| public_static_method | 公共靜態方法 |
| switch | Switch 語句 |
| syserr, serr | 列印到標準錯誤 |
| sysout, sout | 列印到標準輸出 |
| systrace, soutm | 將當前方法列印到標準輸出 |
| try_catch | Try/catch 塊 |
| try_resources | Try-with-resources 語句 |
| while | While 語句 |
Postfix 程式碼片段快捷方式
| 快捷鍵 | 模板內容 | 描述 |
|---|---|---|
| cast | ((SomeType) expr) | 將表示式轉換為新型別 |
| else | if (!expr) | 建立否定的 if 語句 |
| for | for (T item : expr) | 建立 for 語句 |
| fori | for (int i = 0; i < expr.length; i++) | 建立一個遍歷陣列的 for 語句 |
| forr | for (int i = expr.length-1; i >= 0; i--) | 建立一個反向遍歷陣列的 for 語句 |
| if | if (expr) | 建立 if 語句 |
| nnull | if (expr != null) | 建立一個 if 語句並檢查表示式是否不等於 null |
| null | if (expr == null) | 建立一個 if 語句,檢查表示式是否等於 null |
| sysout | System.out.println(expr) | 將受影響的字串傳送到 System.out.println(..) 呼叫 |
| throw | throw expr | 丟擲給定的異常 |
| var | T name = expr | 建立新變數 |
| while | while (expr) {} | 建立 while 迴圈 |