IDEA插件开发总结

前言

IDEA是一个非常强大的工具,对于提高编程效率有非常大的帮助。当然他也不是全能的,有时候的一些需求他可能并没有办法直接满足,这个时候一般就需要通过他的插件来完成了。

目前Idea已经有了非常多的插件可以使用,但有时候可能现有插件并不能满足自己的需求,我就遇到了两个,如生成Bean的Setter方法时,想要同时生成void类型的Setter以及返回Bean类型的Setter方法,并未找到好的插件来使用。于是只好自己研究来写一个。但在写的过程中实在感觉非常的痛苦,它的Api使用起来非常麻烦,在刚开始时简直就没法忍受下去。实际上写完一两个插件后,也会基本也熟悉了他这一套的用法,但实际上还是会忍不住想要吐槽下。写完两个插件后就想着将这些觉用法总结下,以便即使时间长了也有个地方可以翻阅下,不至于后面再要想写的时候又要痛苦一番。

开发步骤

IDEA的插件开发最好是通过IDEA开发工具来进行。

首先创建工程,选择Intellij Platform Plugin类型,其它默认。

创建完成后会发现有一个resources的目录和一个src的目录,在resources/META-INF中有一个plugin.xml的文件,这个文件就是对插件的一些描述及配置,如我们可以指定插件安装后新增的菜单项路径及名称、指定菜单项点击后将会触发的事件等。下面是一个典型的配置:

<idea-plugin>
  <id>cn.liumoran.tools</id>
  <name>GetterSetterGenerator</name>
  <version>1.0</version>
  <vendor email="icarusliu@163.com" url="http://liumoran.cn">刘奇</vendor>

  <description>Idea的Setter与Getter方法生成器。默认的生成器只能生成常规的Getter与Setter方法,或者Builder模式的Setter与Getter方法,而不能两者共存。使用本插件,
    针对一个属性可以生成三个方法,其中一个Getter方法,一个void的Setter方法及一个Builder模式的Setter方法</description>

  <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
  <idea-version since-build="173.0"/>

  <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
       on how to target different products -->
  <!-- uncomment to enable plugin in all products
  <depends>com.intellij.modules.lang</depends>
  -->

  <extensions defaultExtensionNs="com.intellij">
    <!-- Add your extensions here -->
  </extensions>

  <actions>
    <action class="GetterSetterGenerateAction" id="setterGenerator" text="generate setters/getters" keymap="">
      <add-to-group group-id="WindowMenu" anchor="first"/>
    </action>
  </actions>

</idea-plugin>

其中action中的内容最为关键,它指定了菜单项的位置以及点击菜单项后将要执行的Action的哪个。

指定的Action就对应于项目中定义的一个AnAction对象,所有的逻辑处理就都在这个Action中进行,其中最为关键的就是actionPerformed方法。它的定义如下:

    public void actionPerformed(@NotNull AnActionEvent anActionEvent) {}

可以看到它接收的是一个AnActionEvent的对象,通过这个事件对象,我们可以获取到当前所在的项目、当前编辑的文件等。

插件开发完成后,我们可以点击Builder->Prepare Plugin module…这个菜单来生成JAR包,生成后即可通过Idea的插件安装工具通过安装本地文件的方式来进行插件的安装。

插件开发的主要流程就是这样,接下来主要说明在插件开发过程中可能会使用到的各种应用场景如何去实现。

常见场景

常用对象

先介绍下几个常用的对象(JAVA相关应用里面):

  • PsiFile: 对应于应用中的文件,如.Java的文件或者是.xml的文件等;
  • PsiDirectory: 对应于应用中的目录
  • PsiJavaFile: 对应于Java源文件,如Test.java
  • PsiClass: 对应于某个类,其中一个文件中可能会有多个类;
  • PsiMethod: 对应于类中的某个方法
  • PsiField: 对应于类中的某个属性
  • PsiAnnotation: 对应于注解;

常见场景

插件开发中一般都是对这些对象进行操作。下面来看常用的一些操作:

  1. 获取当前项目:

    Project project = anActionEvent.getProject();
    
  2. 获取当前的编辑器对象:

    Editor editor = anActionEvent.getData(CommonDataKeys.EDITOR);
    
  3. 获取当前编辑的文件:

    PsiFile psiFile = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument());
    
    // 如果是Java文件,可以转换成PsiJavaFile
    PsiJavaFile javaFile = (PsiJavaFile)psiFile;
    
  4. 获取JavaFile中的Class:

    // 一个文件中可能会定义有多个Class,因此返回的是一个数组
    PsiClass[] classes = javaFile.getClasses();
    
  5. PsiClass的常用方法:

    • 获取所有属性:getFields、getAllFields
    • 查找属性:findFieldByName(),其中第二个参数是是否查找父类的属性;
    • 获取所有方法:getMethods/getAllMethods
    • 查找方法:findMethodsByName
  6. 在Class中创建Field:

    PsiElementFactory elementFactory = PsiElementFactory.SERVICE.getInstance(project);
                PsiField cField = elementFactory.createFieldFromText(annotationStringBuilder.toString() + "private String test;", null);
    aClass.add(cField);
    
  7. 在Class中创建Method:

    PsiMethod method = elementFactory.createMethodFromText("public void test(){}", null);
    aClass.add(method); 
    
  8. 判断Class或者Field是否包含有某个注解及获取注解属性值:

    PsiAnnotation psiAnnotation = field.getAnnotation("javax.persistence.Column");
    PsiAnnotationMemberValue memberValue = psiAnnotation.findAttributeValue("columnDefinition");
    if (null != memberValue) {
        String str = memberValue.getText();
    }
    
    
    
  9. Import某个类:由于引入类操作是在File中进行的,因此在Class类上是没有办法导入的,如果已经获取到了javaFile对象,那么可以这样导入,否则需要先获取到Class所在的File后再进行导入:

    javaFile.importClass(aClass);
    
    
  10. 根据class获取所在文件:

    (PsiJavaFile) aClass.getContainingFile()
    
    
  11. 获取类所在包:

    // 先获取到文件后再获取文件所在包
    String daoPackage = ((PsiJavaFile) aClass.getContainingFile()).getPackageName();
    
    
  12. 创建文件(包含文件中的类):

    javaFile = (PsiJavaFile) PsiFileFactory.getInstance(project).createFileFromText("Test.java", JavaFileType.INSTANCE, "public class Test {}");
    
    
  13. 获取当前文件所在包:

    PsiDirectory containerDirectory = javaFile.getContainingDirectory();
    
    
  14. 创建子包(子目录):

    parentDirectory.createSubdirectory("test");  
    
    
  15. 将文件添加到包中去

    psiDirectory.add(javaFile);  
    
    
  16. 查找类:

    PsiShortNamesCache shortNamesCache = PsiShortNamesCache.getInstance(project);
    PsiClass[] classes = shortNamesCache.getClassesByName("Test", GlobalSearchScope.allScope(project));
    
    
  17. 获取Resource目录:

    ModuleRootManager rootManager = ModuleRootManager.getInstance(module);
    List<VirtualFile> sourceRoots = rootManager.getSourceRoots(JavaModuleSourceRootTypes.RESOURCES);
    VirtualFile resourceDirectory = sourceRoots.get(0);
    
    
  18. 创建xml文件并加入到某个目录:

    // content对应于XML文件内容
    psiFile = PsiFileFactory.getInstance(project).createFileFromText(fileName, XMLLanguage.INSTANCE,content);
    psiDirectory.add(psiFile);
    
    

其它

最后本人写了两个插件,一个是Bean的Setter与Getter生成插件,地址:http://liumoran.cn/articleDetail/199; 一个是根据Entity对象生成DTO、Service、Controller等相关对象,地址:http://liumoran.cn/articleDetail/200,有兴趣的可以关注下。

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
IntelliJ IDEA 是一款非常流行的 Java 开发工具,它提供了丰富的插件机制,使得开发人员可以方便地扩展 IntelliJ IDEA 的功能。本文将介绍 IntelliJ IDEA 插件开发的基本流程和注意事项。 1. 开发环境搭建 首先,需要安装 IntelliJ IDEA,并在其基础上安装开发插件所需的 SDK 和插件开发工具。可以从 IntelliJ IDEA插件仓库中搜索并安装 Plugin Development Kit 插件,该插件开发者提供了一系列插件开发所需的工具和 API。 2. 创建插件项目 在 IntelliJ IDEA 中创建一个插件项目,可以使用插件开发工具提供的模板来快速创建。在创建插件项目时,需要选择插件类型和插件的基础语言,如 Java、Kotlin 等。 3. 开发插件功能 在插件项目中,可以通过编写代码、配置文件等方式来实现插件的功能。常见的插件功能包括添加自定义菜单、快捷键、工具栏等,还可以通过调用 IntelliJ IDEA 的 API 实现更加复杂的功能,如代码分析、重构等。 4. 调试和测试 在开发插件时,可以通过调试工具来验证代码是否正确。在 IntelliJ IDEA 中,可以使用插件开发工具提供的 Run/Debug Configuration 来配置插件的运行和调试环境。此外,还可以使用单元测试和集成测试来验证插件的功能是否正确。 5. 发布和分发 当插件开发完成后,需要将其打包发布到 IntelliJ IDEA 插件仓库中,以供其他用户使用。在发布前,需要对插件进行一些必要的检查,如检查插件的兼容性、安全性等。发布完成后,可以将插件的信息分享到开发者社区等平台,以便更多的用户了解和使用。 总结 IntelliJ IDEA 插件开发需要掌握 Java 开发技术和 IntelliJ IDEA 插件开发工具的使用。开发者应该了解插件开发的基本流程和注意事项,以便能够快速开发出高质量的插件,并满足用户需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值