导航和编辑 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)),然后输入“@”命令,然后输入您要查找的符号的名称。将出现一个潜在匹配项的列表,并在您键入时进行过滤。从匹配项列表中选择以导航到其位置。
速览定义
您可以使用“Peek Definition”(预览定义)功能快速查看符号的定义方式。此功能会在一个预览窗口中显示定义附近的几行代码,因此您可以查看而无需离开当前位置。
要预览符号的定义,请将光标放在源代码中使用该符号的任何位置,然后按 ⌥F12 (Windows Alt+F12, Linux Ctrl+Shift+F10)。或者,您可以从上下文菜单中选择Peek Definition(预览定义)(右键单击,然后选择Peek Definition)。
转到定义
您也可以使用“Go to Definition”(转到定义)功能快速导航到符号的定义位置。
要转到符号的定义,请将光标放在源代码中使用该符号的任何位置,然后按 F12。或者,您可以从上下文菜单中选择Go to Definition(转到定义)(右键单击,然后选择Go to Definition)。当符号只有一个定义时,您将直接导航到其位置,否则,将如上一节所述在预览窗口中显示相互竞争的定义,并且您必须选择要转到的定义。
转到超类实现
您可以通过悬停时单击Go to Super Implementation(转到超类实现)链接来跟踪类实现和覆盖的方法。

调用层次结构
调用层次结构视图显示到函数的所有调用或来自函数的所有调用,并允许您深入了解调用者的调用者和被调用的调用。右键单击一个函数并选择Peek > Peek Call Hierarchy(预览 > 预览调用层次结构)。

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

类型层次结构
类型层次结构视图显示 Java 对象之间的继承关系。您可以右键单击一个类型并选择Show Type Hierarchy(显示类型层次结构)。
代码折叠
代码折叠允许您折叠或展开代码片段,以便更好地查看源代码。
智能选择
使用智能选择(语义选择),您可以根据源代码中插入点的位置的语义信息来扩展或收缩选择范围。
- 要扩展选择,请使用 ⌃⇧⌘→ (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 开发工具 (JDT) 提供支持,因此您可以期望获得同等水平的支持。
此外,还有一种名为 IntelliCode 的 AI 辅助 IntelliSense。它通过将您最可能使用的内容放在完成列表的顶部来节省您的时间。IntelliCode 建议基于 GitHub 上数千个开源项目,每个项目都有超过 100 个星标,因此它经过训练,了解来自高质量项目中最常见的用法。当与您代码的上下文结合使用时,完成列表会进行定制,以推广这些实践。以下是 IntelliCode 在 Java 中的实际应用。
IntelliCode 可与流行的 Java 库和框架(如 Java SE 和 Spring)很好地配合使用。无论您是进行单体 Web 应用还是现代微服务,它都能为您提供帮助。
创建新文件
VS Code 支持在创建 Java 源文件时应用模板。当您在文件资源管理器中创建 .java 文件时,语言服务器会自动生成类主体,并为您填充包信息
代码片段
Visual Studio Code 支持各种流行的 Java 代码片段,以提高您的工作效率,例如 class/interface、syserr、sysout、if/else、try/catch、static main method。利用 Java 语言服务器的信息,它还在选择过程中提供代码片段的预览。
例如,键入“sout”或“sysout”将生成 System.out.println() 的代码片段。
类似地,键入“main”或“psvm”将生成 public static void main(String[] args) {} 的代码片段。

快捷键的完整列表如下所示
代码片段快捷键
| 快捷键 | 描述 |
|---|---|
| ctor | 公共构造函数 |
| dowhile | Do-while 语句 |
| foreach, iter | 遍历数组或可迭代对象 |
| 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) | 创建一个 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 循环 |