idea插件开发之bean复制插件

news2024/9/22 11:28:08

背景

周末在家无事做,顺手开发了一个之前一直想要做的插件,那就是bean复制插件。

在项目中,由于代码分层设计,对于同样一个数据我们通常会定义不同层的实体,例如xxxEntityxxxDTOxxxVO等,这些不同的实体通常会具有很多相同的字段,在使用时我们需要在进入不同层时将一个类型的对象转换为另外一个类型的对象,此时我们有两种选择:

  • 1、手动new出来一个对象target,然后手动编代码调用getset方法将source中的字段copy到target中;
  • 2、使用各种框架的BeanUtils.copyProperties方法来将source中的字段复制到target中;

对于这两种方案,各有利弊:

  • 如果项目开发比较急,或者想要懒省事,我们通常会使用BeanUtils.copyProperties,因为不需要写代码逐个字段去复制,大大减少工作量,但是性能差、代码重构不友好、不太方便阅读,如果是新人接手项目,很难找到某个字段都在哪里使用了,相信接手过老项目的人深有体会;
  • 对于一些核心模块,或者有性能要求的,通常我们会手动编码调用对象的getset方法来逐个字段复制,这样性能高、代码重构友好、方便阅读,可以很快速找到某个字段的依赖方,但是工作量会比较大:

那有没有一种可能,让我们拥有这两种方案的优势,而又没有各自的劣势呢?

微信公众号:代码深度研究院

当然是有的,如果我们可以自动生成之前需要手动生成的getset调用复制bean字段,那不就既有性能、代码重构友好、方便阅读等优势,又有高效开发的优势了嘛;其实在很早我就有这种想法,想要开发一个插件,能够自动生成bean复制代码替代BeanUtils.copyProperties,但是苦于没有时间(),就没有做,正好上周又想起来这件事了,周末就花了点儿时间来研究了下;

插件开发

准备工作

通过一番简单快速的学习,我们准备好以下事项,就可以开始开发了

官方插件开发文档参考: https://plugins.jetbrains.com/docs/intellij/developing-plugins.html

  • 1、idea,虽然也可以用其他IDE开发,但是毕竟是开发idea的插件,最好还是安装一个最新版的idea;
  • 2、学习Gradle的基本使用,因为最新版插件开发默认使用Gradle作为构建系统;

安装好idea后,需要安装一个插件:Plugn DevKit,该开发套件在2023.2版本以前是跟idea捆绑的,但是从2023.2以后就独立作为一个插件不在捆绑在idea了;

开始开发

首先,我们要创建一个插件项目,可以通过菜单栏的file->new->project->IDE Plugin来创建一个插件项目,项目结构如下;默认是用kotlin语言开发的,源码目录是src/main/kotlin,因为我是主要使用Java作为主语言开发的,所以就给替换为src/main/java了;

plugin/
├── .gradle/
├── .idea/
├── .run/
├── gradle/
├── src/
│   └── main
│       ├── java
│       └── resources
├── .gitignore
├── build.gradle.kts
├── project.iml
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle.kts
--

对于构建脚本build.gradle.kts,这里不详细讲,可以自行学习gradle(这个文件是kotlin语法的,所以还要学习一些简单的kotlin语法),主要讲下我们的实现思路,我们目标是通过调用getset方法把source对象的字段复制到target中,所以需要以下步骤:

1、在code->generate处注册一个菜单(快捷键alt+insert)
2、获取target变量,我们选取当前光标所在位置的变量作为target变量,此时需要校验光标所处位置是否是变量名,如果不是,则隐藏菜单;
3、让用户手动输入source变量名;
4、检查指定名字的变量是否存在,与target是否有同名字段,字段类型是否相同,把同名、同类型的字段挑出来,让用户自己选择要复制的字段;
5、生成调用getset方法复制字段的代码;

由于这里放不了视频和gif(太大),最终使用效果参考微信公众号文章或者插件市场

插件已经在idea的插件市场发布,需要的可以在插件市场搜索BeanCopy来安装,目前是0.0.1版本,如果需要源码,可以在https://github.com/JoeKerouac/idea-bean-copy-plugin找到;由于时间有限,这里不详细说明实现了,有需要的可以自行查看源码或者联系作者;

联系我

  • 作者微信:JoeKerouac
  • 微信公众号(文章会第一时间更新到公众号,如果搜不出来可能是改名字了,加微信即可=_=|):代码深度研究院
  • GitHub:https://github.com/JoeKerouac

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

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

相关文章

echarts地图绘制并实现下钻功能

本文参考网址 使用echarts地图需要先准备好echarts地图渲染需要的json数据&#xff0c;数据可以从阿里云地址中下载自己需要的&#xff0c;下载之后直接引入即可使用&#xff0c;本文针对全国地图做一个简单的demo 阿里云界面如图 // 1、准备echarts地图容器<div class&…

如何借助AI快速筛选和整理文献?

AIPaperGPT&#xff0c;论文写作神器~ https://www.aipapergpt.com/ 在撰写毕业论文时&#xff0c;文献综述是必不可少的部分。它不仅为你的研究提供理论背景&#xff0c;还展示了你对研究领域的深入理解。然而&#xff0c;文献综述的撰写过程常常让学生感到头疼&#xff0c;…

基于JAVA+SpringBoot+Vue的大学校园回忆录系统

基于JAVASpringBootVue的大学校园回忆录系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1f345; …

ElasticSearch-聚合操作

聚合的分类 aggsMetric Aggregation min, max, avg, sumstats, cardinality Bucket Aggregation terms ordertext -> fielddatarangehistogramtop_hits Pipeline Aggregation min_bucketstats_bucketpercentiles_bucketcumulative_sum 聚合的作用范围 Filter, Post Filter,…

5.1.数据结构-c/c++二叉树详解(上篇)(遍历,几种二叉树)

本章所有代码请见&#xff1a;5.3.数据结构-c/c二叉树代码-CSDN博客 目录 一. 二叉树的基本介绍 1.2 满二叉树 1.3 完全二叉树 1.4 搜索二叉树 1.5 平衡二叉搜索树 二. 二叉树的常用操作 2.1 二叉树的定义 2.2 创建一个新的节点 2.3 构建一颗树 2.5 销毁一棵树 三.…

One-Shot Imitation Learning with Invariance Matching for Robotic Manipulation

发表时间&#xff1a;5 Jun 2024 论文链接&#xff1a;https://readpaper.com/pdf-annotate/note?pdfId2408639872513958656&noteId2408640378699078912 作者单位&#xff1a;Rutgers University Motivation&#xff1a;学习一个通用的policy&#xff0c;可以执行一组不…

Linux学习笔记6 值得一读,Linux(ubuntu)软件管理,搜索下载安装卸载全部搞定!(中)

Linux学习笔记5 值得一读&#xff0c;Linux&#xff08;ubuntu&#xff09;软件管理&#xff0c;搜索下载安装卸载全部搞定&#xff01;(上)-CSDN博客 一、前文回顾 上一篇文章我们了解了软件管理的基本概念和软件管理的几种常用工具。我们了解了软件包是由什么形式存在&#…

srt字幕文件怎么制作?分享几个简单步骤,新手必学

srt字幕文件怎么制作&#xff1f;随着短视频平台的发展&#xff0c;现在很多小伙伴喜欢用视频记录生活&#xff0c;分享美好瞬间。在将视频上传到视频平台的时候&#xff0c;我们需要对视频进行剪辑处理。而字幕的使用对提高视频内容的可理解性与传播性变得愈发重要。srt字幕文…

OpenCV 旋转矩形边界

边界矩形是用最小面积绘制的&#xff0c;所以它也考虑了旋转。使用的函数是**cv.minAreaRect**()。 import cv2 import numpy as npimgcv2.imread(rD:\PythonProject\thunder.jpg) img1cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) print(img.dtype) ret,threshcv2.threshold(img1,1…

基于SpringBoot+Vue的美术馆管理系统(带1w+文档)

基于SpringBootVue的美术馆管理系统(带1w文档) 基于SpringBootVue的美术馆管理系统(带1w文档) 本课题研究和开发美术馆管理系统管理系统&#xff0c;让安装在计算机上的该系统变成管理人员的小帮手&#xff0c;提高美术馆管理系统信息处理速度&#xff0c;规范美术馆管理系统信…

【高等数学学习记录】集合

1 知识点 1.1 集合的概念 集合 指具有某种特定性质的事物的总称。集合的元素 组成集合的事物称为集合的元素&#xff08;简称元&#xff09;。有限集、无限集 含有限个元素的集合&#xff0c;则称为有限集&#xff1b;反之&#xff0c;称为无限集。子集 设 A A A、 B B B是两…

HTTP Cookie 和 session

HTTP Cookie HTTP协议本身是无状态&#xff0c;无连接的。 无状态是指&#xff0c;客户每次发起请求&#xff0c;服务器都不认识客户是谁&#xff0c;它只会根据请求返回对应的资源响应。 无连接不是指TCP的无连接&#xff0c;通常指的是HTTP协议本身不在请求和响应之间维护…

哪款宠物空气净化器能更好的清理浮毛?希喂、352、IAM测评分享

家里这三只可爱的小猫咪&#xff0c;已然成为了我们生活中不可或缺的家庭成员&#xff0c;陪伴我们度过了说长不长说短不短的五年时光。时常庆幸自己当年选择养它们&#xff0c;在我失落的时候总能给我安慰&#xff0c;治愈我多时。 但这个温馨的背后也有一点小烦恼&#xff0…

使用Redis实现记录访问次数(三种方案)

目录 0. 前言1. 使用Filter实现2. 使用AOP实现 1. 导入依赖 2. 写一个切面类&#xff0c;实现统计访问次数。 3. 开启AOP 4. 测试 5. plus版本 (1) 新建一个bean类 (2) 新增一个controller方法 (3) 新增一个循环增强方法 (4) 测试…

龙芯+FreeRTOS+LVGL实战笔记(新)——04开启主任务

本专栏是笔者另一个专栏《龙芯RT-ThreadLVGL实战笔记》的姊妹篇&#xff0c;主要的区别在于实时操作系统的不同&#xff0c;章节的安排和任务的推进保持一致&#xff0c;并对源码做了改进和优化&#xff0c;各位可以先到本人主页下去浏览另一专栏的博客列表&#xff08;目前已撰…

基于OGC300工业级LORA网关与OM201L数传终端的化工厂人员定位系统解决方案

化工行业作为高风险的行业之一&#xff0c;其安全管理一直备受关注。化工生产过程中涉及到各种危险品和复杂的工艺&#xff0c;一旦发生事故&#xff0c;往往会造成严重的人员伤亡和财产损失。因此&#xff0c;化工企业急需一套可靠的安全管理系统来监测安全隐患、预防事故发生…

【2024数模国赛赛题思路公开】国赛A题思路丨附可运行代码丨无偿自提

2024年国赛A题解题思路 【题目分析】 问题1&#xff1a;舞龙队沿螺距为55 cm的等距螺线顺时针盘入&#xff0c;给出300秒内舞龙队每秒的位置和速度 分析思路&#xff1a; 螺线方程&#xff1a; 需要建立螺线方程&#xff0c;以便描述龙头及每节板凳的位置。螺线是基于极坐标系…

图形几何算法 -- 凸包算法

前言 常用凸包算法包括Graham Scan 算法和Jarvis March (Gift Wrapping) 算法&#xff0c;在这里要简单介绍的是Graham Scan 算法。 1、概念 凸包是一个点集所包围的最小的凸多边形。可以想象用一根绳子围绕着一群钉子&#xff0c;绳子所形成的轮廓便是这些钉子的凸包。在计算…

谈谈AI领域的认知误区、机会点与面临的挑战

谈谈AI领域的认知误区、机会点与面临的挑战 最近2年&#xff0c;AI 技术的火爆&#xff0c;到处都能看到大家在讨论AI 的发展与机会。这里我们讨论一下AI 认知的误区&#xff0c;机会点和面临的挑战。 by kimmking AI 认知的误区 这年头掀起了所有人讨论AI热潮的同时&#xf…

使用C语言实现字符推箱子游戏

使用C语言实现字符推箱子游戏 推箱子&#xff08;Sokoban&#xff09;是一款经典的益智游戏&#xff0c;玩家通过移动角色将箱子推到目标位置。本文将带你一步步用C语言实现一个简单的字符版本的推箱子游戏。 游戏规则 玩家只能推箱子&#xff0c;不能拉箱子。只能将箱子推到…