一.插件功能

IntelliJ IDEA 是一款流行的JAVA 开发 IDE,对于提高编程效率有非常大的帮助。但是,还是会有一些特殊的需求它并不能满足,此时我们就需要通过开发插件来实现了。

主要的插件功能包含以下四种类型:

  • 自定义语言支持:如果有 IDEA 暂时不支持的语言,可以自己写一个插件来支持,例如 Go 语言原来的支持就是通过插件做的,官方有自定义语言插件支持的教程;

  • 框架支持:例如Struts 2 的框架支持;

  • 工具集成:可以给 IDEA 的自带功能进行增强,例如对 Git 的操作增加 CodeReview 的功能;

  • 用户界面:自定义插件来改变用户界面,比如 BackgroundImage;

二.插件开发常用场景

1.常用对象

JAVA相关应用里面的常用对象:

PsiFile: 应用中的文件,如.Java的文件或者是.xml的文件等;

PsiDirectory: 应用中的目录;

PsiJavaFile: Java源文件,如Demo.java;

PsiClass: 某个类,一个文件中可能会有多个类;

PsiMethod: 类中的某个方法;

PsiField: 类中的某个属性;

PsiAnnotation: 注解;

2.常用操作

Action 是 IDEA 插件开发中比较基本的概念,插件利用 Action 来往菜单栏和工具栏添加新的菜单或按钮,它继承了 com.intellij.openapi.actionSystem.AnAction,当对应的菜单栏或者工具按钮被点击,则Action被调用,最为关键的就是 actionPerformed 方法。它的定义如下:

public void actionPerformed(@NotNull AnActionEvent anActionEvent) {}

定义好之后就可以在方法里面编写我们想要实现的插件功能了,常用的操作如下:

(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的常用方法:

1.获取所有属性:getFields、getAllFields2.查找属性:findFieldByName(),其中第二个参数是是否查找父类的属性;3.获取所有方法:getMethods/getAllMethods4.查找方法: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 psiJavaFile = (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).获取Resource目录:

ModuleRootManager rootManager = ModuleRootManager.getInstance(module);
List<VirtualFile> sourceRoots = rootManager.getSourceRoots(JavaModuleSourceRootTypes.RESOURCES);
VirtualFile resourceDirectory = sourceRoots.get(0);

(17).创建xml文件并加入到某个目录:

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

(18).IDEA不允许在主线程进行实时的文件写入,需要通过一个异步任务进行:

WriteCommandAction.runWriteCommandAction(project, () -> FileUtil.createFile());

IDEA插件开发的具体实现可参考:

IDEA插件开发之实践篇

IDEA插件开发之基础篇相关推荐

  1. android插件框架机制的选择,Android插件开发初探——基础篇

    Android插件开发初探 对于Android的插件化其实已经讨论已久了,但是市面上还没有非常靠谱成熟的插件框架供我们使用.这里我们就尝试性的对比一下Java中,我们使用插件化该是一个怎么样的流程,且 ...

  2. [转]Eclipse插件开发之基础篇(2) 第一个Eclipse插件

    原文地址:http://www.cnblogs.com/liuzhuo/archive/2010/08/15/eclipse_plugin_1_1_1.html 在Eclipse中使用PDE(Plug ...

  3. eclipse java 插件开发_Eclipse插件开发之基础篇(2) 第一个Eclipse插件

    在Eclipse中使用PDE(Plugin Development Environment)进行插件开发.在PDE中为大家准备了几个模板供大家参考.第一步咱们先利用模板制作一个简单的插件作为和PDE的 ...

  4. [转]Eclipse插件开发之基础篇(3) 插件的测试与调试

    原文地址:http://www.cnblogs.com/liuzhuo/archive/2010/08/17/eclipse_plugin_1_1_2.html 1. 使用JUnit对插件进行测试 E ...

  5. C#插件开发之带控件的插件开发(基础篇)

    1.实现功能介绍 插件中存在控件,运行程序时将控件添加到主程序的容器panel中,可执行插件中设定的控件功能. 2.文件架构 3.创建插件接口 namespace PluginFramework {p ...

  6. Android插件开发初探——分析篇

    承接上文 Android插件开发初探--基础篇 http://blog.csdn.net/yzzst/article/details/45582315 我们通过使用DexClassLoader能够将c ...

  7. Jmeter 入门 从0-1 基础篇-实操

    Jmeter 入门 从0-1 基础篇 笔记有的图片链接可能失效了,等我修改好了在来编辑哈 文章目录 1 JMeter 1.1 JMeter环境搭建和基本使用 1.1.1 JMeter环境搭建 1.1. ...

  8. AndroidStudio插件开发(进阶篇之Editor)

    转载请注明出处:[huachao1001的专栏:http://blog.csdn.net/huachao1001/article/details/53885981] 我们开发AndroidStudio ...

  9. 用Kotlin撸一个图片压缩插件-插件基础篇(二)

    简述: 前两天写了篇用Kotlin撸一个图片压缩插件-导学篇,现在迎来了插件基础篇,没错这篇文章就是教你如何一步一步从零开始写一个插件,包括插件项目构建,运行,调试到最后的上线发布整个流程.如果你是插 ...

  10. Python Qt GUI设计:信号与槽的使用方法(基础篇—7)

    目录 1.信号与槽的概念 2.信号与槽的基础函数 2.1.创建信号函数 2.2.连接信号函数 2.3.断开信号函数 2.4.发射信号函数 3.信号和槽的使用方法 3.1.内置信号与槽的使用 3.2.自 ...

最新文章

  1. OpenCV norm 计算范数(18)
  2. C++,那些可爱的小陷阱(三)
  3. Martix工作室考核题 —— 输入一串数字,按要求打印。
  4. 闪屏,default
  5. oracle基础与应用
  6. 东北大学计算机 大一物理考试题,2010-2011东北大学物理考试题及答案
  7. 【Cocos2d-html5】运动中速度效果
  8. 测试显卡风扇的软件,让噪音远离,显卡风扇转速调节
  9. 麒麟安全IPO过会:拟募资6.6亿 第一季营收下降40%
  10. docker学习(十二)docker secret 的使用
  11. 文本框导入图片并显示到页面上
  12. 【Git】分支概念及操作
  13. 两行数据进行对比-python
  14. MySQL 触发器使用入门
  15. testtesttesttest
  16. Altium Designer 10 PCB简要设计及其例程
  17. 物理层的传输介质和设备
  18. QCharts QValueAxis使用
  19. js实现touch移动触屏滑动事件
  20. php递归实现sum函数,php递归函数三种实现方法及如何实现数字累加

热门文章

  1. RAW到底比JPG强在哪里
  2. QAM调制原理_QAM调制:4/5G中各种调制方式基础,均由两条正弦波变化并勾勒出...
  3. websocket报错:java.io.EOFException: null
  4. 框架基础---动态代理
  5. 《嵌入式 – GD32开发实战指南》第1章 开发环境搭建
  6. GD32芯片包下载和安装教程
  7. 弹性地基梁板法计算原理_地基计算模型
  8. 【线上活动】材料计算训练营(量子力学、物理、化学、新能源、碳中和、生物制药、化工、新材料、催化、锂电池、半导体)
  9. WS2812B全彩灯板
  10. 亚马逊全站点、全类目产品爬取,支持批量品牌注册查询,独家技术防屏蔽节省大量选品分析时间,全自动无人值守运行