目标
自定义实现一个自动生成Get And Set方法的插件
简介
对于开发者来说,插件是必不可少的工具,不管是IDEA还是Android Stdio都使用插件来提供某些功能。我们一起来学习一下怎么开发属于自己的插件。
本文主要通过模仿IDEA自动生成Java源代码,一键自动生成get和set方法为例子,完成一个插件的开发。先看效果:
首先我们来看一下IDEA提供的Getter and Setter 功能。
IDEA开发工具原生提供给实体类的成员属性增加get,set方法。下面我们通过插件的方式实现类似的功能。具体流程如下:
实现过程
- 新建工程,选择IDE Plugin,输入工程名称,语言等信息。
- 创建myplugin工程。
- 插件配置信息包括:插件名称,依赖模块。执行类相关信息等。
注册一个Action。当按下组合快捷键时。执行这个Action插件。
<action id="DialogPlugin" class="com.example.myplugin.DialogPlugin"
text="弹窗" description="弹出">
<keyboard-shortcut keymap="$default"
first-keystroke="shift ctrl Y"/>
<!--设置快捷键-->
</action>
- 首先创建一个DialogPlugin类继承AnAction,并实现actionPerformed方法,并在自动在配置文件中注册。当运行项目时,通过配置文件调用DialogPlugin类,执行actionPerformed方法。
- 当插件执行actiPerformed方法时,添加一个自定义的显示弹框。
- 生成布局文件如下:
ShowChose类是主要生成页面绑定的控件,ShowChose.form 是页面布局。
- 通过ShowChose.form文件,设置弹框展示的布局。当调用ShowChose类时,添加布局到弹框中。
- Shochose继承与Jdialog类,然后setTitle设置弹框标题,setContentPane 设置弹框布局,setLocation(x, y)设置弹框显示位置。
- 这里实现的是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类。通过类获取所有的成员属性。
- 当获取当前属性后,插入get和set方法。
由于IDEA 不允许插件在主线程中实时进行文件读写,只能通过开启异步线程完成写入。(这点和android比较类似,不允许在主线程中操作UI)。调用PsiField获取当前成员变量的类型和名称,通过StringBuffer 拼接代码模板,最后插入到文件中。
//开启异步线程
WriteCommandAction.runWriteCommandAction(editor.getProject(), () ->
document.insertString(start,stringBuffer.toString())
);
- 插入代码到类中,需要定位到当前鼠标光标的位置进行代码的插入。
Document document = editor.getDocument();//获取当前文件
// 获取编辑器插入实例
Caret primaryCaret = editor.getCaretModel().getPrimaryCaret();
// 获取当前光标插入的起始位置
int start = primaryCaret.getSelectionStart();
- 按下ctrl+shift+y组合键,最后看一下具体实现效果。
- 弹窗展示当前类名,成员属性,点击生成即可生成get和set方法。
总结
由于篇幅限制,代码较多,本文只讲述部分代码,实现了一个简单的插件。具体UI部分可参考java的SWing UI实现方式。完成插件后,通过签名,发布到 JetBrains Marketplace中,通过开发工具中的Plugins中可以安装到开发工具中使用。