当前位置: 首页 > news >正文

idea插件开发入门

前言:最近想研究一款自动在idea中定位缺陷及发送JIRA的快捷工具,方便提升报自动化脚本的bug的效率。因为idea插件学习是必不可少了,沉淀小结如下。

idea插件开发入门

  • 插件用途
  • 工程创建
  • 配置文件
  • Action实现
  • 开发语法
    • 常用对象
    • 常用方法
  • 运行效果
  • 打包及安装
  • 发布插件

插件用途

idea插件有很多用途,下面举几个常用的说明:
效率提升:JRebel for IntelliJ
一款热部署插件,只要不是修改了项目的配置文件,用它都可以实现热部署。
效率提升:Lombok plugin
开发神器,可以简化你的实体类,让你不再写get/set方法
效率提升:Mybatis plugin
可以在mapper接口中和mapper的xml文件中来回跳转,就想接口跳到实现类那样简单。
效率提升:GsonFormat
一键根据json文本生成java类,非常方便
改变用户界面:activate-power-mode
这是一款让你在编码的时候,增加酷炫动效。

工程创建

项目创建:
在这里插入图片描述

工程目录:
在这里插入图片描述

plugin.xml:里面定义了一些组件、事件等需要注册的内容

配置文件

在这里插入图片描述
重点:plugin.xml和build.gradle
id:表示当前插件的唯一id号
name:插件的名称
version:插件的版本号
vendor:填写开发人的邮箱,公司名称
description:插件的描述,如果将插件上传到IDEA的仓库后,在进行下载的时候就会显示该描述
idea-version:表示当前插件所支持的所有Intellij Idea 的版本
extensions:这里一般会放一些我们自己的扩展的东西,比如新增高亮显示,新增语言支持都是需要在这里进行扩展
actions:新增的Action类需要在这里注册,用于菜单栏扩展
Group:如果想定义一个跟Help同级的菜单,或者是定义包含多个子选项的菜单

在这里插入图片描述
配置gradle依赖

Action实现

  • actionPerformed(AnActionEvent e): 当用户点击IDE中对应Action的图标时会触发此方法,也就是说每选中一次触发一次。
  • update(AnActionEvent e):为了能在用户点击自定义插件对应的菜单项之前动态判断是否将插件项显示,只需重写update函数,在actionPerformed(AnActionEvent e) 之前触发。

举例:想知道点击菜单前就判断插件能否展示,就需要重写update方法,如:

 if (directory.getName().equals("contract"))e.getPresentation().setEnabledAndVisible(true);elsee.getPresentation().setEnabledAndVisible(false);}

开发语法

常用对象

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

常用方法

获取当前项目:

Project project = anActionEvent.getProject();

获取当前的编辑器对象:

Editor editor = anActionEvent.getData(CommonDataKeys.EDITOR);

获取当前编辑的文件:

PsiFile psiFile = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument());

// 如果是Java文件,可以转换成PsiJavaFile
PsiJavaFile javaFile = (PsiJavaFile)psiFile;

获取JavaFile中的Class:

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

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

Import某个类:由于引入类操作是在File中进行的,因此在Class类上是没有办法导入的,如果已经获取到了javaFile对象,那么可以这样导入,否则需要先获取到Class所在的File后再进行导入:

javaFile.importClass(aClass);

根据文件名查找路径
FilenameIndex.getFilesByName()

根据class获取所在文件:

(PsiJavaFile) aClass.getContainingFile()

获取类所在包:

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

javaFile = (PsiJavaFile) PsiFileFactory.getInstance(project).createFileFromText(“Test.java”, JavaFileType.INSTANCE, “public class Test {}”);

获取当前文件所在包:

PsiDirectory containerDirectory = javaFile.getContainingDirectory();

创建子包(子目录):

parentDirectory.createSubdirectory(“test”);

将文件添加到包中去

psiDirectory.add(javaFile);

查找类:

PsiShortNamesCache shortNamesCache = PsiShortNamesCache.getInstance(project);
PsiClass[] classes = shortNamesCache.getClassesByName(“Test”, GlobalSearchScope.allScope(project));

运行效果

demo代码:

    @Overridepublic void actionPerformed(AnActionEvent anActionEvent) {Messages.showMessageDialog("Hello World !", "Information", Messages.getInformationIcon());}

在这里插入图片描述

打包及安装

在这里插入图片描述

发布插件

在这里插入图片描述
附录:Idea插件官方文档:
https://www.jetbrains.org/intellij/sdk/docs/tutorials/action_system/working_with_custom_actions.html

相关文章:

spring boot深入及启动原理探究

围绕spring boot 的优点,本文我们来探究一下spring boot具体是如何实现这些特性的。 自动配置:针对很多Spring应用程序和常见的应用功能,Spring boot能自动提供相关配置;起步依赖:告诉Spring boot需要什么功能,它就能引…...

接口测试那些事儿

什么是接口? 首先,在讲接口测试之前,我们先要搞清楚接口类型的概念。 接口:可能是系统与系统(包括服务与服务)之间的调用,像A系统(服务)给B系统(服务&#x…...

myeclipse的一些使用技巧

一直都是看别人的博客,学习别人的心得, 但是软件行业涉及的技术太多,学过的很多东西都忘了,今天我也弄个博客玩玩, 把我所学的,工作中遇到的问题也做做记录,方便自己,也方便他人&…...

mysql重置Root密码

方法一: 在my.ini的[mysqld]字段加入: skip-grant-tables 重启mysql服务,这时的mysql不需要密码即可登录数据库 然后进入mysql mysql>use mysql; mysql>更新 user set passwordpassword(新密码) WHERE Userroot; mysql>flush privileges; 运…...

JfreeChart柱状图饼图

JfreeChart画出柱状图饼图的代码片段及详细的注释,附件为JfreeChart中文API一览表,和生成的柱状图,饼图图片 import java.awt.Font; import java.io.FileOutputStream; import java.io.IOException; import org.jfree.chart.C…...

自动装配的底层实现

public void autowire(Object o, Map<String, String> map) throws Exception { // 获得map 所有key Set<String> keys map.keySet(); // 获得Object中所有属性 // 获得Class对象 Class c o.getClass(); // 获得…...

java基础需要强化之关键

多线程 进程和线程的区别 ProccessBuilder 和 Runtime.getRuntime().exec java中两种线程的创建方式 extends Thread和 implements Runnable 线程的生命周期&#xff1a;线程创建、Runnable、Running、Blocked、dead sleep、yield、join 等方法 线程打断 interrupt 什么是守护线…...

MD5加密算法详解

注&#xff1a;MD5不是绝对的安全&#xff0c;有俩md5解决 /******************************************************************************* * keyBean 类实现了RSA Data Security, Inc.在提交给IETF 的RFC1321中的keyBean message-digest * 算法。 *****************…...

javaSE之反射

什么是反射&#xff1f; 简单的说&#xff1a;剖析java类中的各个组成部分&#xff0c;映射成一个个java对象。 在java.lang.reflect中。 反射用在哪&#xff1f; 多用于框架和组件&#xff0c;利用反射技术写出复用性高的通用程序 我只列出了反射中几个常用的API 类 Class 构…...

HTTP协议详解

HTTP是一个属于应用层的面向对象的协议&#xff0c;由于其简捷、快速的方式&#xff0c;适用于分布式超媒体信息系统。它于1990年提出&#xff0c;经过几年的使用与发展&#xff0c;得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版&#xff0c;HTTP/1.1的规范化工作…...

javaSE之动态代理

动态代理技术&#xff1a; 使程序更加灵活&#xff0c;可以在代理java类的时候加入一些功能。 很类似过滤器&#xff0c;区别&#xff1a; 过滤器是自己编写西横须实现的功能 动态代理是JVM内部机制 实现步骤&#xff1a; 1.真是业务对象&#xff08;被代理对象&#xff09; 2…...

javaSE之类加载器

类加载器&#xff0c;说白了就是加载类的呵呵 .类加载器负责将.class文件&#xff08;可能在磁盘上&#xff0c;也可能在网络上&#xff09;加载到内存中&#xff0c;并为之生成对应的java.lang.Class对象 .当JVM启动时&#xff0c;会形成由三个类加载器组成的初始类加载器层次…...

java的几种对象(PO,VO,DAO,BO,POJO)解释

一、PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象。最简单的PO就是对应数据库中某个表中的一条记录&#xff0c;多个记录可以用PO的集合。PO中应该不包含任何对数据库的操作。 二、VO:value object值对象。通常用于业务层之间的数据传递&#xff0…...

webservice学习记录笔记(一)

一、先理解什么是服务 现在的应用程序变得越来越复杂&#xff0c;甚至只靠单一的应用程序无法完成全部的工作。更别说只使用一种语言了。 写应用程序查询数据库时&#xff0c;并没有考虑过为什么可以将查询结果返回给上层的应用程序&#xff0c;甚至认为&#xff0c;这就是数…...

Java中堆内存和栈内存详解

Java把内存分成两种&#xff0c;一种叫做栈内存&#xff0c;一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时&#xff0c;java就在栈中为这个变量分配内存空间&#xff0c;当超过变量的作用域后&am…...

Hibernate 主键生成策略

<generator>:主键生成策略 increment:递增,hibernate自动产生主键.max(id) ,采用带走1算法,多进程/集群环境下不推荐使用. identity:设置表主键是自增字段,映射文件采用该策略,依赖底层库, auto_increment identity 适用于MySQL、DB2、MS SQL Server&#xff0c;…...

flex 计算指定日期是本年度第几周

/** * 计算指定日期是本年度第几周 *传日年月日&#xff0c;返回number */ private function weekOfYear(yyyy:Number,mm:Number,dd:Number):Number{ var myDate:Date new Date(yyyy, mm - 1, dd); var startDate:Date new Date(yyyy,0,1); v…...

flex获得指定时间段一共多少天

/** * 获得某个时间段 共有多少天 * param start 开始时间 * param end 结束时间 * return * */ public static function getTimeDays( start:Date , end:Date , type:int0):Number { var _re:int 0 ; if(start && end) { var _str:Numbe…...

flex计算某一日期的周开始和结束日期

/** * 计算 某个日期所在周的开始日期和结束日期 * param value * param isZero 0 当前时间 , 1 日期时间设置为0 &#xff0c; * return Array[0] 周一的日期 Array[1] 周日的日期 * */ public static function getCurrentDayFE(value:Date, isZero:int1):Array…...

flex时间便秒,秒变时间

/** * 秒变时间 * return * */ public static function secondToTime(second:int):Array { var hh:intint(second / 3600); var mm:intint((second % 3600) / 60); var ss:intsecond % 60; return [hh, mm, ss]; } /** * 时间变秒 * param hh 小时 * …...

flex勾选,自动刷新

mxml: <s:CheckBox label"刷新" buttonMode"true" id "frc" selected "{model.autoFresh}" change "{model.startAutoQuery(frc.selected)}"/> <s:Label text"间隔"/> &…...

flex 下拉框验证组件

//继承验证 public class ObjectNullValidator extends Validator { public function ObjectNullValidator() { super(); requiredFieldError "必须填写" ; } private var _invalidCode:String "222"; public static function validateS…...

flex dataGrid组件全选,反选,并获取选中值,代码详解

//1 组建重写 package hxht.comps.datagrid{ import flash.display.DisplayObject; import flash.events.Event; import flash.events.MouseEvent; import mx.collections.ArrayCollection; import mx.collections.IList; import mx.events.DynamicEvent; import spark.comp…...

flex blaze+java通信的例子

步骤&#xff1a; 1&#xff1a;建立java web程序 2&#xff1a; 下载blazeDS包&#xff0c;解压后将WEB-INF下的 flex&#xff0c;lib&#xff0c;web.xml复制到java程序的WEB-INF下 3&#xff1a;打开web.xml文件将以下代码的注释去掉&#xff0c;并修改 <param-value>…...

flex 事件机制详解

事件机制的工作流程 1&#xff1a;关于事件流 当一个事件发生&#xff0c;必然存在一个派发事件的对象&#xff0c;这里称之为目标对象。 当事件发生后flashPlayer生成一个携带数据的对象&#xff0c;然后检查目标对象是否处于显示层中&#xff0c;如果是则遍历从根容器一直到目…...

flex data services

本文来自&#xff1a;http://www.blogjava.net/wldandan/archive/2007/12/06/165856.html 一 FDS相关概念 FDS全称Flex Data Services(现在Adobe将其改名为LiveCycle Data Services),是运行在服务器端的 java程序.它能够运行在大部分的java应用服务器上,包括JRun, JBos…...

flex验证座机,手机的框架

import mx.utils.StringUtil; import mx.validators.ValidationResult; import mx.validators.Validator; public class PhoneValidator extends Validator { public function PhoneValidator() { super(); } private var _phoneInvalid:String"正确格式(010-865…...

actionScript 数组去重

public function unique(array:Array):Array { for (var i:int0; i < array.length; i) { for (var j:inti 1; j < array.length; j) { //注意 if (array[i] array[j]) { array.splice(j, 1); j--; } } } return array…...

面向对象编程的弊端

英文原文&#xff1a;What’s Wrong with OOP and FP 我不理解为什么人们会对面向对象编程和函数式编程做无休无止的争论。就好象这类问题已经超越了人类智力极限&#xff0c;所以你可以几个世纪的这样讨论下去。经过这些年对编程语言的研究&#xff0c;我已经清楚的看到了问题…...

产品之增删查改显算传

原文&#xff1a;http://qingsong.sinaapp.com/?p422 不知道大家在做产品设计时有时候会不会和我一样&#xff0c;一个很简单的功能却给忽略了&#xff0c;或者一个很常规的应用点视而不见&#xff0c;等提交技术开发后才发现少了一点给开发带来了很多困扰&#xff0c;于是不得…...

到底什么是互联网思维

本文转字http://www.managershare.com/2014/04/28/internet-thinking-magic-power/课前秀&#xff1a;三个段子 第一个段子&#xff1a;有一个毫无餐饮行业经验的人&#xff0c;他开了一家餐馆&#xff0c;菜品只有12道&#xff0c;在北京只有两家分店&#xff1b;仅两个月时间…...

产品战略与战术之行业分析

产品的战略和战术之行业分析1确定行业规模行业的规模大小某种程度上讲他决定了产品能够有多少的盈利价值和体量​​互联网是一个强者通吃的行业第一名很舒服第二名能混第三名就很悲催了这一点和传统行业区别相当大&#xff0c;所以在做行业规模预测的时候需要我们仔细评估行业里…...

产品战略战术之预测行业发展趋势

1、根据行业历史预测行业发展趋势移动互联网发展之路从基础性服务面向用户&#xff08;工具类&#xff0c;单体服务类&#xff09;面向应用&#xff08;统计学&#xff0c;关高分享&#xff0c;渠道投送&#xff0c;流量导入&#xff09;到媒体社区类传统互联网迁移&#xff08…...

互联网产品与需求一 获取需求的方法

一、行业调研分析报告​ 1中国移动互联网用户调查数据2列举一些常用的行业数据分析艾瑞网:http://www.iresearch.cn/199IT数据&#xff08;中文互联网数据咨询中心&#xff09;:http://www.199it.com/量子恒定(电商数据分析):http://www.lianezing.com/网站分析在中国:http://w…...

互联网产品与需求二 评估需求

需求分析之评估需求 一.KANO模型 五个用户需求类型1.必备型需求必备型需求是用户认为产品“必须有”的属性或者功能当其特性不充足&#xff08;不满足用户需求&#xff09;时&#xff0c;用户很不满意当其特性充足&#xff08;满足用户需求&#xff09;时&#xff0c;无所谓满意…...

互联网产品与需求三 需求优先级定义

需求优先级定义即便是已经少选评估出来的需求&#xff0c;很多时候量也是非常大的&#xff0c;而哪些该做&#xff0c;哪些不该做&#xff0c;很多时候我们会遇到&#xff1a;Boss拍脑袋要这么做自己拍脑袋要这么做顾此失彼&#xff0c;左顾右盼其实&#xff0c;在产品不同阶段…...