国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【idea】idea插件編寫教程,博主idea插件已上架idea插件市場 歡迎下載

這篇具有很好參考價值的文章主要介紹了【idea】idea插件編寫教程,博主idea插件已上架idea插件市場 歡迎下載。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

前言:經(jīng)常使用Objects.equals(a,b)方法的同學(xué) 應(yīng)該或多或少都會因?yàn)榇中亩鴤麇e參, 例如日常開發(fā)中 我們使用Objects.equals去比較 status(入?yún)?,statusEnum(枚舉), 很容易忘記statusEnum.getCode() 或 statusEnum.getVaule() ,再比如 我們比較一個訂單code時 orderCode(入?yún)?,orderDTO(其它業(yè)務(wù)對象) 很容易忘記orderDTO.getCode() 因?yàn)镺bjects.equals()兩個參數(shù)都是Object類型,idea默認(rèn)不會提示告警, 如果經(jīng)常使用該方法 你一定很清楚的明白我在說什么。

針對以上痛點(diǎn),博主編寫了一個idea插件: Equals Inspection , 插件代碼本身很簡單,極其輕量級。難得的是 在目前暫沒發(fā)現(xiàn)有人做了這件事時,而博主想到了可以通過IDE告警方式去解決問題,并且實(shí)際行動了。此外,知道該用什么API本身是件不容易的事,而閱讀代碼時,已經(jīng)處于一個上帝視角,則會顯得非常簡單。

下載一(推薦):
idea插件市場搜索: Equals Inspection 

【idea】idea插件編寫教程,博主原創(chuàng)idea插件已上架idea插件市場 歡迎下載,intellij-idea,java,ide

下載二:
github :  https://github.com/qiuhuanhen/objects-equals-inspect/releases    


安裝方式:1.idea內(nèi)插件下載會自動安裝  2. github下載直接將jar包拖進(jìn)idea,重啟idea

Q:為什么是IDE插件層面,而不是在java項(xiàng)目中重寫一個工具類 針對類型判斷呢?
A:
1.效率問題:java項(xiàng)目代碼判斷 說明要執(zhí)行到該方法時才能校驗(yàn),很多時候我們編寫完,在測試環(huán)節(jié)被提了bug,我們自己斷點(diǎn)執(zhí)行一遍,才能發(fā)現(xiàn)傳錯了參,插件層面在我們編寫時即可提醒,節(jié)省了大量時間.

2.設(shè)計問題: 很重要的一點(diǎn),java項(xiàng)目層面的提示,要怎么提示?throw new RuntimeExection? 顯然不太合理吧,例如在設(shè)計一些框架/通用代碼時,類型就是可以不一致 難道拋一個異常阻止程序運(yùn)行嗎?插件盡管會提示報錯,但它歸根結(jié)底都只是一個樣式,并不會阻止程序運(yùn)行。

使用前后效果對比:

使用前沒有告警
【idea】idea插件編寫教程,博主原創(chuàng)idea插件已上架idea插件市場 歡迎下載,intellij-idea,java,ide

使用后示例:

【idea】idea插件編寫教程,博主原創(chuàng)idea插件已上架idea插件市場 歡迎下載,intellij-idea,java,ide
vo.getStatus(Integer類型)與枚舉比較時,能直接提示我們類型不一致
(正確寫法是StatusEnum.AWAIT.getValue() 與枚舉類型的值進(jìn)行比較)
【idea】idea插件編寫教程,博主原創(chuàng)idea插件已上架idea插件市場 歡迎下載,intellij-idea,java,ide

以下就以博主編寫的插件為例 ,寫一篇如何編寫idea插件的教程

注:本文由csdn博主 孟秋與你 編寫,如您在其它地方看到本文,很可能是被其它博主爬蟲/復(fù)制過來的,文章可能會持續(xù)更新,強(qiáng)烈建議您搜索:孟秋與你csdn 找到原文查看

第一步:創(chuàng)建插件項(xiàng)目
tips:
1.需要jdk11
2.以idea2021.1版本為例,不同idea版本可能有所差異

new project ->IntelliJ Platform Plugin-> Project SDK (需要jdk11)

【idea】idea插件編寫教程,博主原創(chuàng)idea插件已上架idea插件市場 歡迎下載,intellij-idea,java,ide

第二步:修改plugin.xml文件內(nèi)容及創(chuàng)建java代碼

其中plugin.xml的description節(jié)點(diǎn),需要40個字符以上,否則插件上傳時會報錯。

編寫插件的核心難點(diǎn)在于,我們不知道idea的api是什么,什么情況用什么api。
以下是可以參考的幾點(diǎn):

  1. idea官方文檔 https://plugins.jetbrains.com/docs/intellij/welcome.html
  2. github idea 示例項(xiàng)目:https://github.com/JetBrains/intellij-sdk-code-samples
<idea-plugin>
  <id>csdn-mengqiuyuni</id>
  <name>Equals參數(shù)類型檢查</name>
  <version>0.1.0</version>
  <vendor email="1005738053@qq.com" url="https://blog.csdn.net/qq_36268103"> </vendor>

  <description><![CDATA[
      <li>check java.lang.Objects equals method params type ,if not match,idea will show the error line</li><br>
      <li>could reduce Objects.equals(a,b) error params type by mistake</li><br>
      <li>notice:this plugin can only inspect your code,it's just reminder java developers,but don't impact code execution,and never change or fix your code.</li>
    ]]></description>

  <change-notes><![CDATA[
      <li>github:qiuhuanhen,project name :objects-equals-inspect</li><br>
      <li>beta version.csdn:孟秋與你</li><br>
      <li>the first beta version,welcome,update date:2024.01.09</li>
    ]]>
  </change-notes>

  <vendor>qiuhuanhen</vendor>

  <!-- please see https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html for description -->
  <idea-version since-build="173.0"/>

  <!-- please see https://plugins.jetbrains.com/docs/intellij/plugin-compatibility.html
       on how to target different products -->
  <depends>com.intellij.modules.platform</depends>
  <depends>com.intellij.java</depends>
  <depends>com.intellij.modules.java</depends>

  <extensions defaultExtensionNs="com.intellij">
    <localInspection
            language="JAVA"
            displayName="Title"
            groupPath="Java"
            groupBundle="messages.InspectionsBundle"
            groupKey="group.names.probable.bugs"
            enabledByDefault="true"
            level="ERROR"
            implementationClass="com.qiuhuanhen.ObjectsEqualsInspection"/><!--java類所在路徑-->
  </extensions>

</idea-plugin>

package com.qiuhuanhen;

import com.intellij.codeInspection.LocalInspectionTool;
import com.intellij.codeInspection.ProblemHighlightType;
import com.intellij.codeInspection.ProblemsHolder;
import com.intellij.psi.*;
import org.jetbrains.annotations.NotNull;


/**
 * @author qiuhuanhen
 */
public class ObjectsEqualsInspection extends LocalInspectionTool {

    @NotNull
    @Override
    public PsiElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) {
        return new MyVisitor(holder);
    }

    private static class MyVisitor extends JavaElementVisitor {
        private final ProblemsHolder holder;

        public MyVisitor(ProblemsHolder holder) {
            this.holder = holder;
        }

        @Override
        public void visitMethodCallExpression(PsiMethodCallExpression expression) {
            super.visitMethodCallExpression(expression);

            String methodName = expression.getMethodExpression().getReferenceName();

            if ("equals".equals(methodName)) {

                PsiExpressionList argumentList = expression.getArgumentList();
                PsiExpression[] expressions = argumentList.getExpressions();


                if (expressions.length == 2) {
                    PsiType arg1Type = expressions[0].getType();
                    PsiType arg2Type = expressions[1].getType();

                    // 都為空 不做提示  注:即使idea會提示 type不為空 ,為防止插件報NPE 還是有大量的非空判斷
                    if (null == arg1Type && null == arg2Type) {
                        return;
                    }

                    // 其一為空 給出錯誤提示
                    if (null == arg1Type || null == arg2Type) {
                        holder.registerProblem(expression, "Objects.equals parameters are not of the same type.", ProblemHighlightType.GENERIC_ERROR_OR_WARNING);
                        return;
                    }
                    // 這是忽視某些通用類,框架 用于比較反射class類型的情況
                    if (arg1Type.getCanonicalText().contains("Class") && arg2Type.getCanonicalText().contains("Class")) {
                        return;
                    }

                    if (isByte(arg1Type) && isByte(arg2Type)) {
                        return;
                    }
                    if (isShort(arg1Type) && isShort(arg2Type)) {
                        return;
                    }
                    if (isInt(arg1Type) && isInt(arg2Type)) {
                        return;
                    }
                    if (isLong(arg1Type) && isLong(arg2Type)) {
                        return;
                    }
                    if (isFloat(arg1Type) && isFloat(arg2Type)) {
                        return;
                    }
                    if (isDouble(arg1Type) && isDouble(arg2Type)) {
                        return;
                    }
                    if (isChar(arg1Type) && isChar(arg2Type)) {
                        return;
                    }
                    if (isBoolean(arg1Type) && isBoolean(arg2Type)) {
                        return;
                    }


                    if (!arg1Type.equals(arg2Type)) {

                        holder.registerProblem(expression, "Objects.equals parameters are not of the same type.", ProblemHighlightType.GENERIC_ERROR_OR_WARNING);
                    }
                }
            }
        }

        private boolean isInt(PsiType type) {
            PsiPrimitiveType unboxedType = PsiPrimitiveType.getUnboxedType(type);
            if (PsiType.INT.equals(unboxedType)) {
                // 是 int 類型
                return true;
            }

            return PsiType.INT.equals(type) || "java.lang.Integer".equals(type.getCanonicalText());
        }

        private boolean isLong(PsiType type) {
            PsiPrimitiveType unboxedType = PsiPrimitiveType.getUnboxedType(type);
            if (PsiType.LONG.equals(unboxedType)) {
                // 是 long 類型
                return true;
            }

            return PsiType.LONG.equals(type) || "java.lang.Long".equals(type.getCanonicalText());
        }

        private boolean isDouble(PsiType type) {
            PsiPrimitiveType unboxedType = PsiPrimitiveType.getUnboxedType(type);
            if (PsiType.DOUBLE.equals(unboxedType)) {
                return true;
            }

            return PsiType.DOUBLE.equals(type) || "java.lang.Double".equals(type.getCanonicalText());
        }

        private boolean isFloat(PsiType type) {
            PsiPrimitiveType unboxedType = PsiPrimitiveType.getUnboxedType(type);
            if (PsiType.FLOAT.equals(unboxedType)) {
                return true;
            }

            return PsiType.FLOAT.equals(type) || "java.lang.Float".equals(type.getCanonicalText());
        }

        private boolean isBoolean(PsiType type) {
            PsiPrimitiveType unboxedType = PsiPrimitiveType.getUnboxedType(type);
            if (PsiType.BOOLEAN.equals(unboxedType)) {
                return true;
            }

            return PsiType.BOOLEAN.equals(type) || "java.lang.Boolean".equals(type.getCanonicalText());
        }

        private boolean isByte(PsiType type) {
            PsiPrimitiveType unboxedType = PsiPrimitiveType.getUnboxedType(type);
            if (PsiType.BYTE.equals(unboxedType)) {
                return true;
            }

            return PsiType.BYTE.equals(type) || "java.lang.Byte".equals(type.getCanonicalText());
        }

        private boolean isChar(PsiType type) {
            PsiPrimitiveType unboxedType = PsiPrimitiveType.getUnboxedType(type);
            if (PsiType.CHAR.equals(unboxedType)) {
                return true;
            }

            return PsiType.CHAR.equals(type) || "java.lang.Char".equals(type.getCanonicalText());
        }

        private boolean isShort(PsiType type) {
            PsiPrimitiveType unboxedType = PsiPrimitiveType.getUnboxedType(type);
            if (PsiType.SHORT.equals(unboxedType)) {
                return true;
            }

            return PsiType.SHORT.equals(type) || "java.lang.Short".equals(type.getCanonicalText());
        }

    }
}


第三步:打成jar包
【idea】idea插件編寫教程,博主原創(chuàng)idea插件已上架idea插件市場 歡迎下載,intellij-idea,java,ide
沒有main方法則不用選擇main class
【idea】idea插件編寫教程,博主原創(chuàng)idea插件已上架idea插件市場 歡迎下載,intellij-idea,java,ide
【idea】idea插件編寫教程,博主原創(chuàng)idea插件已上架idea插件市場 歡迎下載,intellij-idea,java,ide

第四步:發(fā)布插件
【idea】idea插件編寫教程,博主原創(chuàng)idea插件已上架idea插件市場 歡迎下載,intellij-idea,java,ide

發(fā)布插件沒有什么難點(diǎn),唯一值得注意的是description非常嚴(yán)格,必須要40個字符以上,且不能有非拉丁字符,博主在反復(fù)修改后發(fā)現(xiàn)不能有任何中文,最后把description里面的中文都改成了英文。

插件項(xiàng)目源碼地址:https://github.com/qiuhuanhen/objects-equals-inspect

打開項(xiàng)目方式:
在github下載博主的項(xiàng)目,idea打開后 默認(rèn)是常規(guī)項(xiàng)目,這時我們需要稍作處理
【idea】idea插件編寫教程,博主原創(chuàng)idea插件已上架idea插件市場 歡迎下載,intellij-idea,java,ide

【idea】idea插件編寫教程,博主原創(chuàng)idea插件已上架idea插件市場 歡迎下載,intellij-idea,java,ide

【idea】idea插件編寫教程,博主原創(chuàng)idea插件已上架idea插件市場 歡迎下載,intellij-idea,java,ide
【idea】idea插件編寫教程,博主原創(chuàng)idea插件已上架idea插件市場 歡迎下載,intellij-idea,java,ide
【idea】idea插件編寫教程,博主原創(chuàng)idea插件已上架idea插件市場 歡迎下載,intellij-idea,java,ide
【idea】idea插件編寫教程,博主原創(chuàng)idea插件已上架idea插件市場 歡迎下載,intellij-idea,java,ide
最后一步:
【idea】idea插件編寫教程,博主原創(chuàng)idea插件已上架idea插件市場 歡迎下載,intellij-idea,java,ide

最后: 原創(chuàng)不易 ,歡迎各位在idea插件商店下載 Equals Inspection , 給github項(xiàng)目點(diǎn)上star 非常感謝各位文章來源地址http://www.zghlxwxcb.cn/news/detail-798098.html

到了這里,關(guān)于【idea】idea插件編寫教程,博主idea插件已上架idea插件市場 歡迎下載的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 5個IntelliJ IDEA插件,高效編寫代碼

    5個IntelliJ IDEA插件,高效編寫代碼

    本文介紹5個由AI驅(qū)動的Intellij IDEA插件,助你提高生產(chǎn)力! 微信搜索關(guān)注《Java學(xué)研大本營》 人工智能AI是當(dāng)前廣受認(rèn)可的未來趨勢和發(fā)展方向。雖然有些人擔(dān)心AI可能會取代所有的工作,但實(shí)際上只會取代那些重復(fù)性高、產(chǎn)出低的工作。因此,我們應(yīng)該學(xué)會更加聰明地工作,

    2024年01月24日
    瀏覽(60)
  • 【工具】國內(nèi)蘋果市場已上架 新一代社交產(chǎn)品 damus

    【工具】國內(nèi)蘋果市場已上架 新一代社交產(chǎn)品 damus

    2月1日,Twitter 聯(lián)合創(chuàng)始人 Jack Dorsey 發(fā)布推文表示,基于分布式社交媒體協(xié)議 Nostr 的社交產(chǎn)品 Damus 和 Amethyst 正式在蘋果 App Store 和谷歌 Google Play Store 上線。 目前為止,Damus 在國內(nèi)蘋果應(yīng)用市場是可以直接下載的,搜索\\\"damus\\\"即可找到,或者復(fù)制這個鏈接到瀏覽器即可自動跳轉(zhuǎn)

    2024年02月02日
    瀏覽(31)
  • uniapp項(xiàng)目 插件市場下載pdd-date-picker【年月日選擇器】路徑不對的問題

    **發(fā)現(xiàn)這個插件用起來很多問題 所以不建議大家用哈 換一個插件 ** 給大家推薦uniapp自帶的日期插件 也超級好用 uniapp自帶的日期插件 如果想修改路徑的可以參考這個 從HBuilder插件市場下載pdd-date-picker年月日插件之后 按照t它的官方問的進(jìn)行引入你會發(fā)現(xiàn)路徑不對,我們需要再

    2024年01月16日
    瀏覽(22)
  • idea如何下載插件

    idea如何下載插件

    大家好,今天給大家分享在idea中如何下載插件 文章目錄 一、idea內(nèi)下載 二、插件市場 總結(jié) 第一種方式就是在idea內(nèi)直接下載,適合在聯(lián)網(wǎng)環(huán)境下進(jìn)行下載,在這我們拿chinese中文翻譯插件為例子,操作步驟如下: 首先點(diǎn)擊設(shè)置(settings)? 然后點(diǎn)擊插件(plugins),在搜索欄搜

    2024年04月28日
    瀏覽(23)
  • idea下載插件方法

    idea下載插件方法

    idea下載插件方法: 有了插件能夠更好的開發(fā)~ 點(diǎn)擊文件(對應(yīng)未漢化的是file) 點(diǎn)擊設(shè)置(對應(yīng)未漢化的是settings) 搜索下載安裝 然后重啟idea即可

    2024年02月12日
    瀏覽(18)
  • 如何下載IDEA主題插件Material Theme UI?

    如何下載IDEA主題插件Material Theme UI?

    1、打開IDEA插件官網(wǎng):點(diǎn)擊這里,選擇IDEA對應(yīng)的版本下載。我的IDEA版本是2021.3,即我應(yīng)下載對應(yīng)的版本6.16.2 2、分別點(diǎn)擊IDEA左上角 File - Settings - Plugins - 設(shè)置 - install Plugin from Disk… ,從你的電腦里導(dǎo)入剛下載的壓縮包Material_Theme_UI-6.16.2 3、( 注意 :路徑不能有中文)我的路

    2024年04月26日
    瀏覽(34)
  • IDEA下載vue.js插件,IDEA搜索不到vue.js該怎么安裝

    IDEA下載vue.js插件,IDEA搜索不到vue.js該怎么安裝

    一、在IDEA插件庫下載Vue.js插件 1.在File--Settings--Plugins下載 2.搜索下載,點(diǎn)擊Apply之后再重啟 二、從磁盤安裝Vue.js插件 IDEA搜索不到vue.js該怎么安裝,這時需要從vue.js官網(wǎng)去下載對應(yīng)jar包進(jìn)行,再進(jìn)行安裝 注意:安裝的Vus.js版本需要于IDEA版本對應(yīng),有版本兼容問題 1.查看IDEA版

    2024年02月04日
    瀏覽(26)
  • IDEA插件之mybatisx 插件使用教程

    IDEA插件之mybatisx 插件使用教程

    ? ? ? ?MybatisX 是一款基于 IDEA 的快速開發(fā)插件,方便在使用mybatis以及mybatis-plus開發(fā)時簡化繁瑣的重復(fù)操作,提高開發(fā)速率。 ? ? ? ? MybatisX的作用就是幫助我們自動化建立mybatis的相關(guān)文件,免去手動建立的繁瑣! 一、安裝MybatisX插件 二、引用相關(guān)的依賴 三、連接MySQL 四、

    2024年02月06日
    瀏覽(34)
  • 2023版IDEA的下載、安裝、配置、快捷鍵、模板、插件與使用

    2023版IDEA的下載、安裝、配置、快捷鍵、模板、插件與使用

    ?? 為什么會有這篇教程: 熟悉 IDEA 并能靈活熟練使用 IDEA 能極大提高您的開發(fā)效率!?。??? 本文教程基于當(dāng)前 idea 的最新版本 2023.2.2 。 ?? 本文教程的所有操作圖片均是實(shí)操測試截圖或 gif 動態(tài)演示,合計 314 張圖片,呈現(xiàn)的截圖使用的 IDEA 的 Dark 主題。 ?? 您的任何設(shè)

    2024年02月08日
    瀏覽(23)
  • 【Gazebo入門教程】第五講 控制器插件的編寫與配置(上)

    【Gazebo入門教程】第五講 控制器插件的編寫與配置(上)

    前言 : 在先前的博客中,我們不僅完成了對機(jī)器人模型的建立和仿真,并且創(chuàng)建了機(jī)器人的工作空間,即仿真環(huán)境的設(shè)置,那么想要通過控制機(jī)器人傳感器來完成對于機(jī)器人的控制就需要進(jìn)一步研究,學(xué)會如何使用 控制插件 ,通過編寫代碼在Gazebo中加載C++庫完成對于機(jī)器人

    2023年04月08日
    瀏覽(60)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包