导航和编辑Java源代码

Visual Studio Code 首先是一个源代码编辑器,具有丰富的编辑功能。在本文档中,我们将介绍一些特定于 Java 的功能,这些功能在使用 Java 时非常有用。

如果您在使用以下功能时遇到任何问题,您可以通过提交一个issue来联系我们。

代码导航

使用大纲视图,您可以方便地浏览当前文件中的成员。项目视图还提供了项目的概览。作为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)。或者,您可以从上下文菜单中选择 Peek Definition(右键单击,然后选择 Peek Definition)。

转到定义

您还可以使用“转到定义”功能快速导航到符号定义的位置。

要跳转到符号的定义,请将光标放在源代码中任何使用该符号的位置,然后按下 F12。或者,您可以从上下文菜单中选择 转到定义(右键单击,然后选择 转到定义)。当符号只有一个定义时,您将直接导航到其位置,否则,如前一节所述,竞争的定义将显示在窥视窗口中,您必须选择要跳转到的定义。

转到超级实现

您可以通过悬停时点击转到超级实现链接来跟踪类的实现和重写方法。

Spring导航

调用层次结构

调用层次结构视图显示从一个函数发出或接收的所有调用,并允许您深入查看调用者的调用者和调用的调用。右键单击一个函数并选择Peek > Peek Call Hierarchy

调用层次结构查看

你也可以在函数体内右键点击并选择显示调用层次结构

调用层次结构菜单

类型层次结构

类型层次结构视图显示了Java对象之间的继承关系。您可以右键点击一个类型并选择显示类型层次结构

折叠区域

折叠区域允许您折叠或展开代码片段,以便更好地查看源代码。

智能选择

使用智能选择(语义选择),您可以根据源代码中光标位置的语义信息扩展或缩小选择范围。

  • 要扩展选择,请使用 ⌃⇧⌘→ (Windows, Linux Shift+Alt+Right)
  • 要缩小选择范围,请使用 ⌃⇧⌘← (Windows, Linux Shift+Alt+Left)

语义高亮

语法高亮是一个重要的功能,它可以帮助你更高效地阅读代码。借助语义高亮,VS Code 可以根据 Java 语言服务的符号信息提供更准确的源代码着色。

下面只是一个例子,左边是启用语义高亮后的行为,右边是仅使用语法高亮的行为。

语义高亮

您可以在Java语言支持扩展维基上了解更多关于Java语义高亮的详细信息。

使用Spring Boot导航代码

Spring Boot Tools 扩展为 Spring Boot 项目提供了增强的导航和代码补全支持。

  • @/ 显示所有定义的请求映射(映射路径、请求方法、源位置)
  • @+ 显示所有定义的bean(bean名称,bean类型,源位置)
  • @> 显示所有函数(原型实现)
  • @ 显示代码中的所有Spring注解

Spring导航

要了解更多关于Visual Studio Code对Spring Boot的支持,请阅读Visual Studio Code中的Spring Boot

代码编辑

使用IntelliSense进行智能代码补全和签名详细信息,编辑代码也变得容易。您可以使用代码片段以及各种代码操作,例如生成Getters/Setters和组织导入,以进一步提高您的工作效率。

Visual Studio Code 中的 Java 支持会自动检测代码中的问题,并为您提供快速修复建议。

有关重构和代码操作的更多详细信息,请参阅重构和源代码操作

智能感知

Visual Studio Code 中的 Java 代码补全功能由 Red Hat 提供的 Java™ 语言支持 提供。该扩展由与 Eclipse 相同的 Java 开发工具 (JDT) 驱动,因此您可以期待相同水平的支持。

此外,还有一种名为IntelliCode的AI辅助智能感知功能。它通过将您最可能使用的内容放在完成列表的顶部来节省您的时间。IntelliCode的建议基于GitHub上数千个开源项目,每个项目都有超过100颗星,因此它是在高质量项目中最常见用法的基础上进行训练的。当与您的代码上下文结合时,完成列表会被定制以推广这些实践。以下是IntelliCode在Java中的实际应用。

IntelliCode 与流行的 Java 库和框架(如 Java SE 和 Spring)配合良好。无论您是在开发单体 Web 应用程序还是现代微服务,它都能为您提供帮助。

创建新文件

VS Code 支持在创建 Java 源文件时应用模板。当你在文件资源管理器中创建一个 .java 文件时,语言服务器会自动生成类体,并为你填充包信息:

代码片段

Visual Studio Code 支持多种流行的 Java 代码片段,以提高您的生产力,例如类/接口、syserr、sysout、if/else、try/catch、静态主方法。利用 Java 语言服务器的信息,它还在选择期间提供代码片段的预览。

例如,输入“sout”或“sysout”将生成System.out.println()的代码片段。
同样,输入“main”或“psvm”将生成public static void main(String[] args) {}的代码片段。

代码片段

完整的快捷键列表如下:

代码片段快捷方式

shortcut key description
ctor Public constructor
dowhile Do-while statement
foreach, iter Iterate over an array or Iterable
fori Iterate over array
if If statement
ifelse If-else statement
ifnull If statement checking for null
ifnotnull If statement checking for not null
main, psvm Public static main method
new Create new Object
private_method Private method
private_static_method Private static method
prf Private field
protected_method Protected method
public_method Public method
public_static_method Public static method
switch Switch statement
syserr, serr Print to standard err
sysout, sout Print to standard out
systrace, soutm Print current method to standard out
try_catch Try/catch block
try_resources Try-with-resources statement
while While statement

Postfix 片段快捷方式

shortcut key template content description
cast ((SomeType) expr) Casts the expression to a new type
else if (!expr) Creates a negated if statement
for for (T item : expr) Creates a for statement
fori for (int i = 0; i < expr.length; i++) Creates a for statement which iterates over an array
forr for (int i = expr.length-1; i >= 0; i--) Creates a for statement which iterates over an array in reverse order
if if (expr) Creates a if statement
nnull if (expr != null) Creates an if statement and checks if the expression does not resolve to null
null if (expr == null) Creates an if statement which checks if expression resolves to null
sysout System.out.println(expr) Sends the affected string to a System.out.println(..) call
throw throw expr Throws the given Exception
var T name = expr Creates a new variable
while while (expr) {} Creates a while loop