# 使用技巧

返回:idea

run anything-->已设置快捷键ctrl + alt + 引号

  1. 写代码时用 Alt-Insert ( Code|Generate… )可以创建类里面任何字段的 getter 与 setter 方法。

  2. 右键点击断点标记(在文本的左边栏里)激活速查菜单,你可以快速设置 enable/disable 断点或者条件它的属性

  3. CodeCompletion (代码完成)属性里的一个特殊的变量是,激活 Ctrl-Alt-Space 可以完成在或不在当前文件里的类名。如果类没有引入则 import 标志会自动创建

  4. 使用 Ctrl-Shift-V 快捷键可以将最近使用的剪贴板内容选择插入到文本。使用时系统会弹出一个含有剪贴内容的对话框,从中你可以选择你要粘贴的部分

  5. 利用 CodeCompletion (代码完成)属性可以快速地在代码中完成各种不同地语句,方法是先键入一个类名地前几个字母然后再用 Ctrl-Space 完成全称。如果有多个选项,它们会列在速查列表里

  6. Ctrl-/Ctrl-Shift-/ 来注释、反注释代码行与代码块。

  7. Alt-Q( View|Context Info )可以不需要移动代码就能查看当前方法地声明。连续按两次会显示当前所编辑的类名

  8. 使用 Refactor|Copy Class… 可以创建一个所选择的类的“副本”。这一点很有用,比如,在你想要创建一个大部分内容都和已存在类相同的类时

  9. 在编辑器里 Ctrl-D 可以复制选择的块或者没有所选块是的当前行

  10. Ctrl-W (选择字)在编辑器里的功能是先选择脱字符处的单词,然后选择源代码的扩展区域。举例来说,先选择一个方法名,然后是调用这个方法的表达式,然后是整个语句,然后包容块,等等

  11. 在使用 CodeCompletion 时,可以用逗点( .)字符,逗号()分号(),空格和其它字符输入弹出列表里的当前高亮部分。选择的名字会随着输入的字符自动输入到编辑器里

  12. 在调试程序时查看任何表达式值的一个容易的方法就是在编辑器中选择文本(可以按几次 Ctrl-W 组合键更有效地执行这个操作)然后按 Alt-F8

  13. Ctrl-F12 ( View | File Structure Popup )键你可以在当前编辑的文件中快速导航。 这时它会显示当前类的成员列表。选中一个要导航的元素然后按 Enter 键或 F4 键。要轻松地定位到列表中的一个条目,只需键入它的名字即可

  14. 在代码中把光标置于标记符或者它的检查点上再按 Alt-F7 (右键菜单中的 Find Usages… )会很快地查找到在整个工程中使用地某一个类、方法或者变量的位置

  15. 把光标放到查看点上再按 Ctrl-Alt-B 可以导航到一个抽象方法的实现代码

  16. Ctrl-J 组合键来执行一些你记不起来的 Live Template 缩写。比如,键“ it ”然后按 Ctrl-J 看看有什么发生

  17. Introduce Variable 整合帮助你简化代码中复杂的声明。举个例子,在下面的代码片断里,在代码中选择一个表达式:然后按 Ctrl-Alt-V

  18. Ctrl-Shift-J 快捷键把两行合成一行并把不必要的空格去掉以匹配你的代码格式

  19. Ctrl-Shift-Backspace ( Go to | Last Edit Location )让你调转到代码中所做改变的最后一个地方。多按几次 Ctrl-Shift-Backspace 查看更深的修改历史

  20. 使用 IDEA 的 Live Templates | Live Templates 让你在眨眼间创建许多典型代码。比如,在一个方法里键入。再按 Tab 键看有什么事情发生了

  21. 要查看一个文件中修改的本地历史,激活右键菜单里的 Local VCS | Show History… 。也许你可以导航不同的文件版本,看看它们的不同之处再回滚到以前的任何一个版本吧。 使用同样的右键菜单条目还可以看到一个目录里修改的历史。有了这个特性你就不会丢失任何代码了

  22. 要在编辑器里显示方法间的分隔线,打开 Options | IDE Settings | Editor ,选中“ Show method separators ”检查盒( checkbox )

  23. Alt-UpAlt-Down 键可以在编辑器里不同的方法之间快速移动

  24. F2/Shift-F2 键在高亮显示的语法错误间跳转。用 Ctrl-Alt-Down/Ctrl-Alt-Up 快捷键则可以在编译器错误信息或者查找操作结果间跳转

  25. 通过按 Ctrl-O ( Code | Override Methods… )可以很容易地重载基本类地方法。要完成当前类 implements 的(或者抽象基本类的)接口的方法,就使用 Ctrl-I ( Code | Implement Methods… )

  26. 如果光标置于一个方法调用的括号间,按 Ctrl-P 会显示一个可用参数的列表

  27. Ctrl-E ( View | Recent Files )弹出最近访问的文件右键列表。选中文件按 Enter 键打开

  28. 在 IDEA 中可以很容易地对你的类,方法以及变量进行重命名并在所有使用到它们的地方自动更正。试一下,把编辑器脱字符置于任何一个变量名字上然后按 Shift-F6 ( Refactor | Rename… )。在对话框里键入要显示地新名字再按 Enter 。你会浏览到使用这个变量地所有地方然后按“ Do Refactor ”按钮结束重命名操作

  29. 当你想用代码片断捕捉异常时,在编辑器里选中这个片断,按 Ctrl-Alt-T ( Code | Surround with… )然后选择“ try/catch ”。它会自动产生代码片断中抛出的所有异常的捕捉块。在 Options | File Templates | Code tab 中你还可以自己定制产生捕捉块的模板。 用列表中的其它项可以包围别的一些结构。

  30. 在使用代码完成时,用 Tab 键可以输入弹出列表里的高亮显示部分。 不像用 Enter 键接受输入,这个选中的名字会覆盖掉脱字符右边名字的其它部分。这一点在用一个方法或者变量名替换另一个时特别有用

# 调试中的小诀窍,让飞起

back

# 条件断点

back

循环中经常用到这个技巧,比如:遍历1个大List的过程中,想让断点停在某个特定值

ideaHint1.jpg

调试时,就会自动停在i=5的位置

# 回到上一步

back

好不容易跑起来,一不小心手一抖,断点过去了,想回过头看看刚才的变量值

ideaHint2.jpg

单击[Drop Frame]之后,回退到上一步了

ideaHint3.jpg

但是继续往下执行,此时看下图

ideaHint4.jpg

PS:想知道为啥这个功能叫Drop Frame,而不是类似Back To Previous 之类的,可以去翻翻JVM的书,JVM内部以栈帧为单位保存线程的运行状态,drop frame即扔掉当前运行的栈帧,这样当前“指针”的位置,就自然到了上一帧的位置

# 多线程调试

back

多线程同时运行时,谁先执行,谁后执行,完全是看CPU心情的,无法控制先后,运行时可能没什么问题,但是调试时就比较麻烦了

ideaHint5.jpg

# 远程调试

back

这也是一个装B的利器,本机不用启动项目,只要有源代码,可以在本机直接远程调试服务器上的代码

# 临时执行表达式

ideaHint6.jpg

# 五个很实用的IDEA使用技巧

日常开发中,相信广大 Java 开发者都使用过 IntelliJ IDEA 作为开发工具,IntelliJ IDEA 是一款优秀的 Java 集成开发环境,它提供了许多强大的功能和快捷键,可以帮助开发者提高编码效率和质量。除了一些常见的技巧,如自动导包、智能补全、重构工具等。IntelliJ IDEA 还有一些不为人知的技巧,可能很多开发者都没有注意到或者使用过。本文就在为你介绍博主常用的五个 IntelliJ IDEA 使用技巧,希望能够给你带来一些工作效率上的提升。本文内容大纲如下:

  • 注释对齐
  • 快速创建包目录/文件夹
  • 快付复制类代码生成 Java 类
  • 多实例启动
  • 分支比较

注意:本文的示例截图以及操作演示都是基于 IntelliJ IDEA 2023.2 版本而来。过低版本可能不尽相同,大家注意。

# 1、注释对齐

日常开发中,相信大家在添加注释时都知道使用快捷键 ctrl + / ,不过大家可能会遇见下面这种情况,

    public DiamondJumpContext(List<DiamondJumpType> diamondJumpTypes) {
//添加注释
        for (DiamondJumpType diamondJumpType : diamondJumpTypes) {
//            map.put(diamondJumpType.getType(), diamondJumpType);
        }
    }
1
2
3
4
5
6

可以看到,使用快捷键 ctrl + / 添加注释代码或者注释已有代码时,默认是在首行位置,无法与下方 for 循环代码自动对齐,造成了视觉上的不美观,那如何解决这个问题嘞?其实解决方法就藏在 IDEA 里,我来告诉大家如何设置。

打开 IDEA 设置 Editor -> Code Style -> Java -> Code Generation,找到下方的 Comment code 区域取消 Line comment at first column 的默认勾选,将 Add a space at line comment start 以及 Enforce on reformat 打上勾就可以了。如下图所示,

316894416257706.png

然后我们重新给上面的示例代码打赏注释时,效果就是下面这样了,

    public DiamondJumpContext(List<DiamondJumpType> diamondJumpTypes) {
        // 添加注释
        for (DiamondJumpType diamondJumpType : diamondJumpTypes) {
            // map.put(diamondJumpType.getType(), diamondJumpType);
        }
    }
1
2
3
4
5
6

大家可以很明显的看到,此时添加的注释默认是跟当前代码对齐,并且自动留出一个空格,代码的可阅读性有了很大提升。

# 2、快速创建包目录/文件夹

# 创建包目录

日常开发时,当大家想新建 Java 类时,考虑到项目的包目录划分可能需要新建一个包目录,那么大家是如何操作的嘞?是先创建好包目录后,在创建 Java 类吗?其实在 IDEA 中创建 Java 类时,是可以直接顺带创建包目录的,具体操作如下。

在创建 Java 类时,直接写出包目录名称通过 . 拼接即可,如下图新建 Java 类时填上 ht.DemoController

328845016250375.png

# 创建文件夹

快速创建文件夹的方式跟快速创建包目录差不多,只不过将 . 拼接改为 /即可,如下图新建文件时填上 ht/test.csv

# 3、快付复制类代码生成 Java 类

日常中有个场景,博主经常在上网浏览网上的技术资料,看到感兴趣的文章时,想要复制文章中的 demo 代码在本地跑一遍验证一下。于是就有了这个快付复制代码生成 Java 类的需求。起初博主老老实实通过常规操作在本地手动创建 Java 类,然后拷贝 demo 代码进行验证。后来了解到其实在 IDEA 中是有快付复制类代码生成 Java 类的功能,这里分享给大家。

假如当前我们想要快速复制下方的 Java 类代码到 IDEA 项目中,那改如何操作嘞?

/**
 * 金刚位跳转策略配置
 */
@Component
public class DiamondJumpContext {

    private final Map<Integer, DiamondJumpType> map = new HashMap<>();

    /**
     * 由spring自动注入DiamondJumpType子类
     *
     * @param diamondJumpTypes 金刚位跳转类型集合
     */
    public DiamondJumpContext(List<DiamondJumpType> diamondJumpTypes) {
        for (DiamondJumpType diamondJumpType : diamondJumpTypes) {
            map.put(diamondJumpType.getType(), diamondJumpType);
        }
    }

    public DiamondJumpType getInstance(Integer jumpType) {
        return map.get(jumpType);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

其实操作是很简单的,我们可以通过全选复制上述 Java 类代码,然后打开 IDEA,鼠标选中指定的包目录后通过 ctrl + v即可。

# 4、多实例启动

日常本地开发微服务项目时,博主想要验证一下网关的负载均衡以及感知服务上下线能力时,需要用到多实例启动。

那么什么是多实例启动?简单说就是能在本地同时启动多个同一服务。打个比方项目中有一个 MobileApplication 服务,我现在想要同时启动两个 MobileApplication 服务,通过不同端口区分,该如何操作嘞?IDEA 中其实是支持这个操作的。我将给大家介绍如何启用多实例功能。

打开服务配置,点击 Modify options 选项,

532975616246930.png

勾选打开 Operation System -> Alow multiple instance ,继续勾选打开 Java -> Program arguments,然后在 Program arguments 输入框中指定端口,在 Spring 项目中通过 --server.port=9999,如下图(注意每次启动实例时,这里的端口不能相同),

53475916242684.png

# 5、分支比较

日常开发中,当项目上线时,博主经常会使用这个功能,用于比较当前新功能分支与 master 分支的代码差异
假如新功能分支上线前经历了多个人员参与迭代以及冲突修复,作为项目主程的你需要在项目上线前进行代码 review,以确保代码质量,那该如何操作嘞? 其实 IDEA 已经贴心的为我们做好了一切,这里我将给大家介绍远程分支比较功能。

右键项目根目录,找到 Git -> Compare with Branch 选项,点击打开,

32960117260564.png

此时 IDEA 会显示项目的所有分支列表,我们从中找到 master 分支,点击即可,

# 打开run dashboard

back

设置打开Run Dashboard (View-》Tool Windows-》Run Dashboard

如果上述的选项里没有Run Dashboard,可以在工程目录下找.idea文件夹下的workspace.xml,在其中增加如下组件

<component name="RunDashboard">
<option name="configurationTypes">
    <set>
    <option value="SpringBootApplicationConfigurationType" />
    </set>
</option>
<option name="ruleStates">
    <list>
    <RuleState>
        <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
    </RuleState>
    <RuleState>
        <option name="name" value="StatusDashboardGroupingRule" />
    </RuleState>
    </list>
</option>
</component>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# IDEA REST客户端控制台

工具栏依次工具-> HTTP客户端->测试RESTFUL Web服务:后,IDEA REST客户端控制台的界面如下样式

2021-01-21_141707.gif

请求方式,请求参数和请求头的填充都已经包含了,
特别说明下的是,如果请求的方式是授权:基本方式方式认证的话,可以点击下图所示的按钮,会插入替换用户名和密码的窗口出来,填完后会自动补充到授权的标题里面去

2021-01-21_141850.gif

# 历史请求记录

2021-02-08_155012.gif

IntelliJ IDEA自动将最近执行的50个请求保存到http-requests-log.http文件中,该文件存储在项目的.idea / httpRequests /目录下。使用请求历史记录,您可以快速导航到特定响应并再次如果从请求历史记录再次发出请求,则其执行信息和响应输出的链接将添加到请求历史记录文件的顶部。

# 构建HTTP请求脚本

上面的历史记录就是一个完整的IDEA REST客户请求脚本,如果你是从控制台触发的,那么可以直接复制历史请求记录的文件放到项目里作为HTTP请求的脚本,给其他成员共享,如果不是,也可以直接新建一个.http.rest结尾的文件,IDEA会自动识别为HTTP请求脚本。

# 语法部分

通过脚本新建的请求存储的位置 2021-02-08_155310.gif

### 演示POST请求
POST {{baseUrl}}}get?show_env=1
Accept: application/json

{
   "name":"a"
}
### 演示GET请求

GET {{baseUrl}}}/post
Content-Type: application/x-www-form-urlencoded

id=999&value=content
1
2
3
4
5
6
7
8
9
10
11
12
13

首先通过###三个井号键来分开每个请求体,然后请求url和header参数是紧紧挨着的,请求参数不管是POST的正文传参还是GET的参数传参,都是要换行的

# 环境区分

变量可以保存以下请求组件的值

  • 请求ip,端口和路径
  • 查询参数或值
  • 请求头的值
  • 在外部文件为请求体提供任意值

细心的你可能发现了上面的示例代码,没有真实的请求地址,取而代之的,是一个的占位符,这个就是IDEA REST Client真香的地方,支持从指定的配置文件中获取到环境相关的配置参数,多个baseUrl可以通过占位符替换,一些请求的参数是否和接口环境相关的都可以通过配置文件来区分。

2021-02-08_170706.gif

首先项目的根目录下创建一个称为http-client.private.env.json(或者rest-client.env.json 或者 http-client.env.json, rest-client.private.env.json)的文件,
然后内容如下,一级的键值时采用不同的环境, dev,uat,pro等,环境下的对象就是一次HTTP请求中能够获取到的环境变量了,你可以直接在请求的HTTP的脚本中通过占位符的方式获取到此处配置的参数

TIP

  • rest-client.env.json 或者 http-client.env.json 表示这个文件是包含普通的变量,并把里面的变量分发到项目中。
  • rest-client.private.env.json 或者 http-client.private.env.json 表示该文件是一个私人的文件,可能包括密码,令牌,证书和其他敏感信息。
    默认情况下,此文件被添加到 VCS 忽略文件列表中。http-client.private.env.json 文件中指定的变量的值将覆盖环境文件中的值

# 结果断言

IDEA REST客户端可以针对接口的响应值进行脚本化的断言处理,立马从一个接口调试工具上升到测试工具了,类似:

### Successful test: check response status is 200
GET https://httpbin.org/status/200

> {%
client.test("Request executed successfully", function() {
  client.assert(response.status === 200, "Response status is not 200");
});
%}
1
2
3
4
5
6
7
8

# 结果值暂存

client.global.set 存储全局变量,通过 client.global.get 获取变量。可以通过 client 对象在内存中存储数据,可以保留到 idea 关闭之前。

试想下这样的场景,当一个系统需要通过认证才能访问的时候,如果用邮递员的时候,是不是先访问登录接口,然后获得令牌后,手动复制到新的调试接口的header参数里面去,这太麻烦了,IDEA REST Client还有一个真香的功能,可以完美解决这个问题,请看下面的脚本:

### 演示POST请求
POST https://httpbin.org/post
Content-Type: application/json

{
  "user": "admin",
  "password": "123456"
}

> {% client.global.set("auth_token", response.body.json.token); %}
### 演示GET请求

GET https://httpbin.org/headers
Authorization: bearer {{auth_token}}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

在第一个认证的请求结束后,可以在响应里拿到返回的令牌信息,然后我们通过脚本设置到了变量里,然后在接下来的接口请求中,就可以直接使用双大括号占位符的方式获取到这个token了

# 响应处理程序脚本

> 开头,然后把脚本包装在 {%%} 里面。

# 上传文件处理

POST http://localhost:9999/duty/api/v1/studyQuestion/import
Content-Type: multipart/form-data; boundary=boundary
Authorization: bearer {{access_token}}

--boundary
Content-Disposition: form-data; name="param";

ht
--boundary
Content-Disposition: form-data; name="file"; filename="question.xlsx"

< ../../stormWeb/src/assets/study/question.xlsx
--boundary--
1
2
3
4
5
6
7
8
9
10
11
12
13
@PostMapping("import")
public Result importExcel(HttpServletRequest request) {
    try {
//            List<MultipartFile> files
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        MultipartFile multipartFile = multipartRequest.getFile("file");
        List<QuestionImportExcelVo> list = EasyExcelUtil.importExcel(multipartFile, QuestionImportExcelVo.class);
//            List<QuestionImportExcelVo> list = EasyExcelUtil.importExcel(files.get(0), QuestionImportExcelVo.class);
        return this.studyQuestionBs.importExcel(list);
    } catch (Exception e) {
        return Result.getFailure(e.getMessage());
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 如何创建git新分支删除分支

223515816246460.png

当然也可以命令行操作

# 检出分支
git checkout mysql
# 更新分支代码
git pull
# 本地创建新分支,并切换到该分支(此时执行git branch会看到分支在本地已经创建)
git checkout -b dev_202402
# 将本地分支推送到仓库,此时执行 git branch -av 可以看到该分支已经在仓库中
git push origin dev_202402
# 将本地分支与仓库分支关联
git branch --set-upstream-to=origin/dev_202402 dev_202402
1
2
3
4
5
6
7
8
9
10

# idea中如何删除本地分支

466160417266626.png

# idea中拉取仓库中所有分支信息

61680617259295.png

# idea中合并某分支到另一分支

  • 1、检出需要被合并的分支并拉取最新代码
  • 2、将需要合并的分支合并到当前分支

448341518255850.png

最后push到仓库