导航并编辑 Java 源代码
Visual Studio Code 首先是一个源代码编辑器,具备丰富的编辑功能。在本文档中,我们将介绍一些对 Java 开发非常有用的 Java 特有功能。
如果您在使用以下功能时遇到任何问题,可以通过提交问题联系我们。
代码导航
借助 大纲视图 (Outline view),您可以方便地导航当前文件中的成员。项目视图 (Projects view) 也提供了项目概览。作为 Java 编辑器,它还支持调用层次结构、类型层次结构、定义导航、在工作区中搜索类型等功能。
搜索符号
您可以搜索当前文件或工作区中的符号,以更快速地导航代码。
在工作区中搜索符号
要在当前工作区中搜索符号,请按 ⌘T (Windows, Linux Ctrl+T),然后输入符号名称。匹配列表将如前所示出现。如果您选择的匹配项位于尚未打开的文件中,系统将在导航到该位置前打开该文件。或者,您也可以使用快速打开 (Quick Open) (⌘P (Windows, Linux Ctrl+P)),然后输入“#”命令来搜索当前工作区。⌘T (Windows, Linux Ctrl+T) 只是“#”命令的快捷方式,因此功能完全一致。
在当前文件中搜索符号
要在当前文件中搜索符号,请使用快速打开 (Quick Open) (⌘P (Windows, Linux Ctrl+P)),然后输入“@”命令,接着输入您要查找的符号名称。潜在匹配项列表将会出现,并随您的输入实时过滤。从匹配列表中选择即可导航到目标位置。
速览定义
您可以使用“速览定义 (Peek Definition)”功能快速查看符号的定义。此功能会在一个速览窗口中显示定义附近的几行代码,这样您无需离开当前位置即可进行查看。
要速览符号定义,请将光标置于源代码中该符号的任何使用位置,然后按 ⌥F12 (Windows Alt+F12, Linux Ctrl+Shift+F10)。或者,您可以从右键菜单中选择速览定义 (Peek Definition)。
转到定义
您还可以使用“转到定义 (Go to Definition)”功能快速导航到符号的定义位置。
要转到符号定义,请将光标置于源代码中该符号的任何使用位置,然后按 F12。或者,您可以从右键菜单中选择转到定义 (Go to Definition)。当符号仅有一个定义时,您将直接跳转到该位置;否则,竞争的定义将显示在上一节所述的速览窗口中,您需要从中选择要前往的定义。
转到超级实现 (Super Implementation)
通过点击悬停时显示的转到超级实现 (Go to Super Implementation) 链接,您可以跟踪类实现和重写方法。

调用层次结构 (Call Hierarchy)
调用层次结构 (Call Hierarchy) 视图显示了函数的所有调用者和被调用者,并允许您深入查看调用者的调用者或调用者的调用。右键点击函数并选择速览 (Peek) > 速览调用层次结构 (Peek Call Hierarchy)。

您也可以在函数体内右键点击并选择显示调用层次结构 (Show Call Hierarchy)。

类型层次结构 (Type Hierarchy)
类型层次结构 (Type Hierarchy) 视图显示 Java 对象之间的继承关系。您可以右键点击某个类型并选择显示类型层次结构 (Show Type Hierarchy)。
折叠区域
折叠区域允许您折叠或展开代码片段,以便更好地查看源代码。
智能选择 (Smart Selection)
借助 智能选择 (Smart Selection)(语义选择),您可以根据源代码中插入点位置的语义信息来扩大或缩小选择范围。
- 要扩大选择范围,请使用 ⌃⇧⌘→ (Windows, Linux Shift+Alt+Right)。
- 要缩小选择范围,请使用 ⌃⇧⌘← (Windows, Linux Shift+Alt+Left)。
语义高亮 (Semantic Highlighting)
语法高亮是一项让您可以更高效阅读代码的重要功能。在 语义高亮 (Semantic Highlighting) 的帮助下,VS Code 可以根据 Java 语言服务提供的符号信息提供更准确的源代码着色。
以下是一个示例,左侧是启用语义高亮后的效果,右侧仅显示语法高亮。

您可以在 Java 语言支持扩展 Wiki 上了解有关 Java 语义高亮的更多详细信息。
使用 Spring Boot 进行代码导航
Spring Boot Tools 扩展为 Spring Boot 项目提供了增强的导航和代码补全支持。
@/显示所有已定义的请求映射(映射路径、请求方法、源位置)@+显示所有已定义的 Bean(Bean 名称、Bean 类型、源位置)@>显示所有函数(原型实现)@显示代码中所有的 Spring 注解

要了解有关 Visual Studio Code 对 Spring Boot 支持的更多信息,请阅读 Visual Studio Code 中的 Spring Boot。
代码编辑
借助智能代码补全和签名详情的 IntelliSense,代码编辑变得非常简单。您可以使用代码片段以及各种代码操作(如生成 Getter/Setter 和组织导入),进一步提高工作效率。
Visual Studio Code 中的 Java 支持会自动检测代码中的问题,并为您提供快速修复建议。
有关重构和代码操作的更多详情,请参阅 重构与源代码操作。
IntelliSense
Visual Studio Code 对 Java 的代码补全功能由 Language Support for Java™ by Red Hat 提供。该扩展由 Eclipse 背后的同款 Java 开发工具 (JDT) 驱动,因此您可以期待相同级别的支持。
此外,还有一种名为 IntelliCode 的 AI 辅助 IntelliSense。它通过将您最可能使用的内容置于补全列表顶部来节省您的时间。IntelliCode 的建议基于 GitHub 上数千个超过 100 星的开源项目,因此它是通过高质量项目中通用的使用习惯训练而来的。结合您的代码上下文,补全列表会经过定制以推广这些实践。以下是 IntelliCode for Java 的实际演示。
IntelliCode 适用于主流的 Java 库和框架,如 Java SE 和 Spring。无论您是在开发单体 Web 应用还是现代微服务,它都能为您提供帮助。
创建新文件
VS Code 支持在创建 Java 源文件时应用模板。当您在资源管理器中创建 .java 文件时,语言服务器将自动为您生成类体并填充包信息。
代码片段
Visual Studio Code 支持多种流行的 Java 代码片段以提高您的工作效率,例如 class/interface、syserr、sysout、if/else、try/catch、静态 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 语句 |
后缀代码片段快捷方式
| 快捷键 | 模板内容 | 描述 |
|---|---|---|
| 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) | 创建检查表达式不为 null 的 if 语句 |
| null | if (expr == null) | 创建检查表达式是否为 null 的 if 语句 |
| sysout | System.out.println(expr) | 将受影响的字符串发送到 System.out.println(..) 调用 |
| throw | throw expr | 抛出给定的异常 |
| var | T name = expr | 创建新变量 |
| while | while (expr) {} | 创建 while 循环 |