IDEA插件开发之一键生成Java类

516 阅读3分钟

目标

自定义实现一个自动生成Get And Set方法的插件

简介

对于开发者来说,插件是必不可少的工具,不管是IDEA还是Android Stdio都使用插件来提供某些功能。我们一起来学习一下怎么开发属于自己的插件。

本文主要通过模仿IDEA自动生成Java源代码,一键自动生成get和set方法为例子,完成一个插件的开发。先看效果:

首先我们来看一下IDEA提供的Getter and Setter 功能。

IDEA开发工具原生提供给实体类的成员属性增加get,set方法。下面我们通过插件的方式实现类似的功能。具体流程如下:

实现过程

  1. 新建工程,选择IDE Plugin,输入工程名称,语言等信息。

  1. 创建myplugin工程。

  1. 插件配置信息包括:插件名称,依赖模块。执行类相关信息等。

注册一个Action。当按下组合快捷键时。执行这个Action插件。

<action id="DialogPlugin" class="com.example.myplugin.DialogPlugin"
                text="弹窗" description="弹出">
            <keyboard-shortcut keymap="$default"
                               first-keystroke="shift ctrl Y"/> 
    <!--设置快捷键-->
        </action>
  1. 首先创建一个DialogPlugin类继承AnAction,并实现actionPerformed方法,并在自动在配置文件中注册。当运行项目时,通过配置文件调用DialogPlugin类,执行actionPerformed方法。

  1. 当插件执行actiPerformed方法时,添加一个自定义的显示弹框。

  1. 生成布局文件如下:

ShowChose类是主要生成页面绑定的控件,ShowChose.form 是页面布局。

  1. 通过ShowChose.form文件,设置弹框展示的布局。当调用ShowChose类时,添加布局到弹框中。

  1. Shochose继承与Jdialog类,然后setTitle设置弹框标题,setContentPane 设置弹框布局,setLocation(x, y)设置弹框显示位置。
  2. 这里实现的是Get and Set 插件。我们看一下代码如何实现。
/**获取当前文件**/
PsiFile psiFile = event.getData(CommonDataKeys.PSI_FILE);
Editor editor = event.getData(CommonDataKeys.EDITOR);
/**获取当前文件的Class类**/
PsiClass targetClass = getTargetClass(editor, psiFile);
/**获取实体类的所有成员属性**/
PsiField[] allFields = targetClass.getAllFields();

通过AnactionEvent获取当前打开文件和Class类。通过类获取所有的成员属性。

  1. 当获取当前属性后,插入get和set方法。

由于IDEA 不允许插件在主线程中实时进行文件读写,只能通过开启异步线程完成写入。(这点和android比较类似,不允许在主线程中操作UI)。调用PsiField获取当前成员变量的类型和名称,通过StringBuffer 拼接代码模板,最后插入到文件中。

//开启异步线程
WriteCommandAction.runWriteCommandAction(editor.getProject(), () ->
                    document.insertString(start,stringBuffer.toString())
            );
  1. 插入代码到类中,需要定位到当前鼠标光标的位置进行代码的插入。
           Document document = editor.getDocument();//获取当前文件
            // 获取编辑器插入实例
            Caret primaryCaret = editor.getCaretModel().getPrimaryCaret();
            // 获取当前光标插入的起始位置
            int start = primaryCaret.getSelectionStart();
  1. 按下ctrl+shift+y组合键,最后看一下具体实现效果。

  1. 弹窗展示当前类名,成员属性,点击生成即可生成get和set方法。

总结

由于篇幅限制,代码较多,本文只讲述部分代码,实现了一个简单的插件。具体UI部分可参考java的SWing UI实现方式。完成插件后,通过签名,发布到 JetBrains Marketplace中,通过开发工具中的Plugins中可以安装到开发工具中使用。