一、環境准備:
1. IDEA確保已安裝好插件Plugin DevKit
2. 新建Plugin插件工程,選擇SDK為安裝IDEA包下的SDK,如果找不到就定位到IDEA安裝包下找
3. 起好工程名,直接finish,如下我創建了plugindemo插件工程
二、開發第一個彈窗Action示例
1. 在src下右鍵創建一個TestMenu Action,填寫配置信息,其中class name就是插件Action類名,Name就是插件功能菜單顯示名稱,Groups中要選擇插件功能屬於哪,如右鍵中就是EditorPopupMenu,還可以在Keyboard Shortcuts中設置快捷鍵,注意不要和其他快捷鍵沖突
創建完后得到plugin.xml中的action如下
<actions> <action id="plugin-testmenu" class="TestMenu" text="Test_Menu" description="測試"> <add-to-group group-id="EditorPopupMenu" anchor="first"/> </action> </actions>
2. 在TestMenu類的actionPerformed方法中添加代碼JOptionPane.showMessageDialog(null, "Hello World");
3. debug模式啟動plugin,此后IDEA會啟動一個沙箱進程,開啟的沙箱IDEA中,右鍵就可以看到自己的插件了(注意,有可能沙箱進程慢,插件菜單要等一段時間才可點擊)。如果沙箱進程沒有打開過項目,可以自己通過File打開一個,可以選擇在當前窗口打開,需要手動在沙箱中安裝插件,當然要先進行插件生成
4. 點擊插件按鈕TestMenu,如果有斷點可以看到進入斷點,直接運行看到彈窗
5. 修改下plugin.xml中的idea-plugin節點下name,該name用於插件名稱顯示
6. build下編譯成jar包就可以安裝了,如果依賴了其他jar包,會編譯成zip包,同樣可以安裝。
重啟后效果
三、創建一個Action組,並將多個action放到組里
1. 再創建一個Action類,這次不用選擇組
2. 修改plugin.xml中actions節點如下,group中的text就是插件組菜單的名稱
<actions> <group id="hjpActionGroup" text="hjpActions" popup="true"> <add-to-group group-id="EditorPopupMenu" anchor="first"/> </group> <action id="plugin-testmenu" class="TestMenu" text="Test_Menu" description="測試"> <add-to-group group-id="hjpActionGroup"/> </action> <action id="plugin-testmenu2" class="TestMenu2" text="Test_Menu2" description="測試"> <add-to-group group-id="hjpActionGroup"/> </action> </actions>
3. 沙箱運行,效果如下
四、通過PsiFile操作Java代碼文件
注意plugin.xml需要加入依賴
<depends>com.intellij.modules.java</depends>
1. 獲取PsiJava
PsiFile psiFile = e.getData(LangDataKeys.PSI_FILE); if (psiFile instanceof PsiJavaFile) { PsiJavaFile psiJavaFile = (PsiJavaFile) psiFile;
2. 獲取PsiClass
PsiClass[] classes = psiJavaFile.getClasses();
PsiClass psiClass = (PsiClass) classes[0];
3. 獲取當前PsiClass的父類
PsiClass superClass = psiClass.getSuperClass();
4. 獲取PsiField
PsiField[] fields = psiClass.getFields();
5. 獲取字段類型的類名
String fieldType = field.getType().getPresentableText();
6. 獲取字段注解內容
PsiAnnotation[] annotations = field.getAnnotations(); for (PsiAnnotation annotation : annotations) { final PsiJavaCodeReferenceElement nameReferenceElement = annotation.getNameReferenceElement(); if (nameReferenceElement != null) { final String referenceName = nameReferenceElement.getReferenceName(); //注解完整內容,自行處理 } }
7. 獲取字段注釋內容,docComment.getText()獲取到完整內容,可自行處理
PsiDocComment docComment = field.getDocComment();