idea插件开发之一起来开发个map转对象的插件吧!

news2024/11/25 7:12:23

写在前面

源码 。

在实际工作中,经常有这样的场景,从map中获取值来赋值到某个对象上,这无疑是一个重复的劳动,本文来尝试通过编写一个这样的插件,让插件来帮我们写代码,不管是有1个属性,还是有30个属性,都能在瞬间完成,开始吧!

1:开发

idea已经提供了这样的功能,在generate中生成get,set,tostring等,如下图:
在这里插入图片描述
因为我们要做的和这些功能其实是类似,所以,也将菜单放在这里。首先需要创建一个Action:
在这里插入图片描述

<action id="map2obj" class="com.dahuyou.action.Map2ObjAction" text="map转对象" description="map转对象插件">
    <add-to-group group-id="GenerateGroup" anchor="first"/>
    <keyboard-shortcut keymap="$default" first-keystroke="ctrl alt K"/>
</action>
public class Map2ObjAction extends AnAction {

    @Override
    public void actionPerformed(AnActionEvent e) {
        Messages.showInfoMessage("点击了", "提示");
    }
}

试下效果:
在这里插入图片描述

到这里,我们来看下最终要实现的插件希望达到一个什么效果,我们希望是这样的,比如我们有如下的代码:

Map map = fn();
MyObj myObj = new MyObj();

我们要将map中的值设置到myObj中,即最终生成这种代码:

Map map = fn();
MyObj myObj = new MyObj();
myObj.setProp1(map.get("prop1"));
myObj.setProp2(map.get("prop2"));
...

为了实现这个目标,思路是这样子的:

1:用户需要复制Map map,这样我们就可以获取到属性值的数据源信息
2:用户将光标放在MyObj myObj,这样我们就可以获取要设置属性值的目标对象信息
3:动态的生成myObj.setProp1(map.get("prop1"));这种代码到源文件中

首先,来定义接口,如下:

/**
 * map转obj顶层规范接口,只提供过一个核心的生成代码的方法
 */
public interface IMap2ObjGenerator {
    /**
     * 唯一的核心方法,具体的操作步骤在抽象子类中以模板方法的方式提供,之后具体子类提供具体实现,完成业务逻辑,
     * 这样当我们有很多的子类时,重复的工作就不需要做了,而只需要实现特有的功能就行了
     * @param project
     * @param dataContext
     * @param psiFile
     */
    void doGenerate(Project project, DataContext dataContext, PsiFile psiFile);
}

可以看到在接口中我们只有一个核心的方法doGenerate,就是来生成代码的,通过如下的关键步骤来完成工作。

1: 获取用户所在的上下文信息,为后续获取相关信息做准备
2: 获取要设置属性值的目标对象,从中获取其属性信息
3:获取map源对象信息
4:织入set代码

抽象类如下:

/**
 * 抽象类,提供模板方法
 */
public abstract class AbstractMap2ObjGenerator implements IMap2ObjGenerator {
    /**
     * 提取属性名称使用 ,如setXyz()则xyz就是属性名称了
     */
    protected final String setRegex = "set(\\w+)";

    /**
     * 模板方法
     * @param project
     * @param dataContext
     * @param psiFile
     */
    @Override
    public void doGenerate(Project project, DataContext dataContext, PsiFile psiFile) {
        // 1: 获取用户所在的上下文信息,为后续获取相关信息做准备
        GenerateContext generateContext = generateUserContext(project, dataContext, psiFile);
        // 2: 获取要设置属性值的目标对象,从中获取其属性信息
        TargetObjInfo targetObjInfo = generateTargetObjInfo(generateContext);
        // 3:获取map源对象信息
        SourceObjInfo sourceObjInfo = generateSourceObjInfo(generateContext);
        // 4:织入set代码
        weavingSetCode(targetObjInfo, sourceObjInfo, generateContext);
    }

    /**
     * 织入代码
     * @param targetObjInfo
     * @param sourceObjInfo
     * @param generateContext
     */
    protected abstract void weavingSetCode(TargetObjInfo targetObjInfo, SourceObjInfo sourceObjInfo, GenerateContext generateContext);

    /**
     *
     * @param generateContext
     * @return
     */
    protected abstract SourceObjInfo generateSourceObjInfo(GenerateContext generateContext);

    /**
     *
     * @param generateContext
     * @return
     */
    protected abstract TargetObjInfo generateTargetObjInfo(GenerateContext generateContext);

    /**
     *
     * @param project
     * @param dataContext
     * @param psiFile
     * @return
     */
    protected abstract GenerateContext generateUserContext(Project project, DataContext dataContext, PsiFile psiFile);

}

具体子类为Map2ObjGeneratorImpl,具体的代码就看源码吧,我觉得最重要的还是这个思路!!!

2:测试

首先创建如下测试类:

public class Target {
    private String name;
    private String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

接着写测试代码:

public class xx {
    public static void main(String[] args) {
        Map<String, String> sourceMap = new HashMap<>();
        sourceMap.put("name", "最激昂萨满");
        sourceMap.put("age", "99");

        Target target = new Target();




    }
}

按照如下步骤测试即可:
在这里插入图片描述

3:在idea中安装插件(用起来吧!)

因为我并没有发布到idea的插件市场,所以不能搜索到,但你可以从这里 下载安装包,通过离线安装的方式来使用,如下:
在这里插入图片描述
安装完成后,重启idea,如下就是安装成功了:
在这里插入图片描述
使用的话就和测试时一样了。

本来想上传到idea市场的,但每次提交直接给我来个服务报错,告诉我hiccup了:
在这里插入图片描述
我能咋办???

你安装使用了吗?是的话就点个赞让我知道下吧🙁🙁🙁!!!

写在后面

参考文章列表

idea插件开发之系列 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1835578.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

创维超充车辆交付仪式暨参观座谈会圆满举行

6月14日&#xff0c;创维超充车辆交付仪式暨参观座谈会在南京成功举行。苏舜集团副总经理程璟一行以及近多出行东部大区总经理张显春一行齐聚一堂。创维汽车总裁、联合创始人吴龙八等领导亲临现场&#xff0c;对各位尊贵嘉宾的到来表示热烈欢迎&#xff0c;并与众人共同见证了这…

RAM和ROM

1&#xff0c;RAM和ROM区别 RAM和ROM都是由来存储的&#xff0c;比如CPU缓存&#xff0c;电脑和手机内存等属于RAM,而固态硬盘&#xff0c;U盘&#xff0c;手机的128G,256G存储空间等都属于ROM。他们的最主要区别是RAM在断电后存储数据就没有了&#xff0c;而ROM在断电后存储数…

Java基础面试题自测

文章目录 一、Java 中有哪 8 种基本数据类型&#xff1f;说说这 8 种基本数据类型对应的包装类型&#xff1f;二、包装类型的常量池技术了解么&#xff1f;三、为什么要有包装类型&#xff1f;四、什么是自动拆装箱&#xff1f;原理&#xff1f;四、遇到过自动拆箱引发的 NPE 问…

Ps:脚本与动作

有三种脚本语言可用于编写 Photoshop 脚本&#xff1a;AppleScript&#xff08;macOS&#xff09;、JavaScript 和 VBScript&#xff08;Windows&#xff09;。 Photoshop 脚本文件默认文件夹 Win&#xff1a;C:\Program Files\Adobe\Adobe Photoshop 2024\Presets\Scripts Mac…

无线麦克风推荐哪些品牌?一文读懂家用无线麦克风哪个牌子好!

​在这个充满创意与表达的时代&#xff0c;无线领夹麦克风以其独特的魅力&#xff0c;成为了声音创作者们的得力助手。它小巧便携&#xff0c;功能强大&#xff0c;无论是日常拍摄、直播互动还是专业演出&#xff0c;都能轻松应对&#xff0c;让你的声音随时随地清晰传递。那么…

PIL保存后的图像莫名的失真,部分不失真部分很失真

原图片是这样的&#xff1a; PIL会自行**“自救”被正则化的图片&#xff0c;导致自救过曝&#xff0c;部分颜色非常失真&#xff0c;但是部分又保存的还行。现象如下&#xff1a; 这里你检查一下你保存的是不是被正则化的图片**&#xff0c;如果是&#xff0c;改改。 查看一…

长难句打卡6.17

At a time when Thomas Piketty and other economists are warning of rising inequality and the increasing power of inherited wealth, it is bizarre that wealthy aristocratic families should still be the symbolic heart of modern democratic states. 在托马斯皮凯…

基于Java的二手手机回收平台系统

开头语&#xff1a; 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JavaJSPServlet 工具&#xff1a;IDEA/Eclipse、Navicat、Maven 系统展…

Postman接口测试之postman设置接口关联,实现参数化

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 postman设置接口关联 在实际的接口测试中&#xff0c;后一个接口经常需要用到前一个接口返回的结…

如何轻松进行照片压缩?5个软件帮助你快速进行照片压缩

如何轻松进行照片压缩&#xff1f;5个软件帮助你快速进行照片压缩 照片压缩是一种常见的图像处理操作&#xff0c;旨在减小图像文件的大小而尽量保持图像质量。有许多软件和工具可供选择&#xff0c;每个工具都有其独特的压缩算法和功能。以下是一些关于照片压缩的详细信息&am…

XMind for mac/win:解锁思维边界的思维导图神器

在信息爆炸的时代&#xff0c;高效地整理思绪、捕捉灵感成为了每个人的迫切需求。XMind for mac/win作为一款功能强大的思维导图软件&#xff0c;以其卓越的性能和易用性&#xff0c;赢得了广大用户的青睐。 一、跨平台兼容&#xff0c;无缝体验 XMind for mac/win完美兼容Ma…

Ubuntu-24.04-live-server-amd64安装界面中文版

系列文章目录 Ubuntu安装qemu-guest-agent Ubuntu-24.04-live-server-amd64启用ssh Ubuntu乌班图安装VIM文本编辑器工具 文章目录 系列文章目录前言一、准备工作二、开始安装三、测试效果总结 前言 Centos结束&#xff0c;转战Ubuntu。我之所以写这篇文章&#xff0c;是因为我…

计算机网络5:运输层

概述 进程间基于网络的通信 计算机网络中实际进行通信的真正实体&#xff0c;是位于通信两端主机中的进程。 如何为运行在不同主机上的应用进程提供直接的逻辑通信服务&#xff0c;就是运输层的主要任务。运输层协议又称为端到端协议。 运输层向应用层实体屏蔽了下面网络核心…

【x264】整体框架汇总

【x264】整体框架汇总 1. x264整体框架图2. 思考 参考&#xff1a; x264源代码简单分析&#xff1a;概述 参数分析&#xff1a; 【x264】x264编码器参数配置 流程分析&#xff1a; 【x264】x264编码主流程简单分析 【x264】编码核心函数&#xff08;x264_encoder_encode&…

vue大作业-端午节主题网站

vue大作业-端午节主题网站介绍 端午节&#xff0c;又称为龙舟节&#xff0c;是中国的传统节日之一&#xff0c;每年农历五月初五庆祝。这个节日不仅是纪念古代爱国诗人屈原的日子&#xff0c;也是家人团聚、共享美食的时刻。今天&#xff0c;我们非常高兴地分享一个以端午节为…

有效招聘营销策略的六个组成部分

任何想吸引更多人购买其产品的公司都必须投资于市场营销。然而&#xff0c;当涉及到让更多的人了解公司的工作时&#xff0c;许多有效的营销活动可能不是招聘团队的首要考虑因素。为了超越招聘委员会上的“发布祈祷”策略&#xff0c;有必要包括有效招聘营销策略的所有组成部分…

COUNTIF函数除计数,还可排序哦

COUNTIF函数除统计个数外&#xff0c;还可以排序哦&#xff01; 近期工作中遇到一个场景“对不同类型的人员按办理量进行排序”&#xff0c;前期只是对同一种类型进行排序&#xff0c;经过查阅资料&#xff0c;可以用COUNTIF函数解决问题&#xff0c;今天就把COUNTIF函数的用法…

ROS学习记录:launch文件启动Hector_Mapping的建图功能

前言 SLAM软件包Hector_Mapping 在上一篇笔记中&#xff0c;通过Hector_Mapping软件包实现了SLAM功能&#xff0c;运行了四条指令&#xff0c;有些麻烦。本文通过launch文件的使用将指令整合起来&#xff0c;方便功能的实现。 一、打开终端&#xff0c;输入cd catkin_ws1/src…

基于java+springboot+vue实现的在线远程考试系统(文末源码+Lw)230

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自…

如何处理跨库查询,以保证数据一致性

如何处理跨库查询&#xff0c;以保证数据一致性&#xff1f; 处理跨库查询以保证数据一致性是一个复杂的问题&#xff0c;通常涉及到分布式数据库系统和事务管理。以下是一些关键步骤和策略&#xff1a; 使用事务: 在多个库之间执行操作时&#xff0c;确保它们作为一个原子单元…