当前位置:   article > 正文

intellij idea 插件 实现点击bean的set设置方法_idea设置set所有bean属性

idea设置set所有bean属性

github 案例地址: https://github.com/GL-GIT-HUB/intellij-idea-plugin

插件 下载地址: https://download.csdn.net/download/gl_mine_csdn/10922867

  1. package com.xgjk;
  2. import com.intellij.openapi.actionSystem.AnAction;
  3. import com.intellij.openapi.actionSystem.AnActionEvent;
  4. import com.intellij.openapi.actionSystem.LangDataKeys;
  5. import com.intellij.openapi.actionSystem.PlatformDataKeys;
  6. import com.intellij.openapi.application.Application;
  7. import com.intellij.openapi.application.ApplicationManager;
  8. import com.intellij.openapi.application.Result;
  9. import com.intellij.openapi.command.WriteCommandAction;
  10. import com.intellij.openapi.compiler.CompilationException;
  11. import com.intellij.openapi.editor.Document;
  12. import com.intellij.openapi.editor.Editor;
  13. import com.intellij.openapi.editor.ScrollType;
  14. import com.intellij.openapi.editor.SelectionModel;
  15. import com.intellij.openapi.project.Project;
  16. import com.intellij.openapi.ui.Messages;
  17. import com.intellij.openapi.util.text.StringUtil;
  18. import com.intellij.psi.*;
  19. import com.intellij.psi.search.GlobalSearchScope;
  20. import com.intellij.psi.search.PsiShortNamesCache;
  21. import com.intellij.psi.util.PsiTreeUtil;
  22. import org.jetbrains.annotations.NotNull;
  23. /**
  24. * Created by XG on 2017/6/1.
  25. */
  26. public class xgjkConvertBean extends AnAction {
  27. @Override
  28. public void actionPerformed(AnActionEvent e) {
  29. init(e);
  30. }
  31. /**
  32. * 初始化处理
  33. * @param e
  34. */
  35. private void init(AnActionEvent e) {
  36. //根据响应的事件 获取到当前事件所在的项目、编辑器、文件、
  37. Project project = e.getData(PlatformDataKeys.PROJECT);
  38. Editor editor = e.getData(PlatformDataKeys.EDITOR);
  39. PsiFile psiFile = e.getData(LangDataKeys.PSI_FILE);
  40. assert editor != null;
  41. Document document = editor.getDocument();
  42. SelectionModel selectionModel = editor.getSelectionModel();
  43. //根据编辑器获取当前的model、获取选中的文本
  44. String modelSelectedText = selectionModel.getSelectedText();
  45. //校验选中的文本
  46. if (StringUtil.isEmpty(modelSelectedText)) {
  47. return;
  48. }
  49. //获取当前上下文的类
  50. PsiClass mPsiClass = getPsiClassFromContext(e,psiFile,editor);
  51. //创建一个对话框、提示消息、获取输入的消息
  52. String aimName = Messages.showInputDialog(project, "目的模型的名称?", "请输入名称", Messages.getQuestionIcon());
  53. //通过某个字段名字拿到全项目中的该类对象
  54. assert project != null;
  55. PsiClass[] classesByName = PsiShortNamesCache.getInstance(project).
  56. getClassesByName(modelSelectedText, GlobalSearchScope.allScope(project));
  57. // 得到convertBean
  58. StringBuffer stringBuffer = getConvertBean(aimName, classesByName);
  59. //写入到编辑器内容
  60. writeEditorStr(project, editor, document, selectionModel, stringBuffer);
  61. }
  62. /**
  63. * 得到convertBean
  64. * @param aimName
  65. * @param classesByName
  66. * @return
  67. */
  68. @NotNull
  69. private StringBuffer getConvertBean(String aimName, PsiClass[] classesByName) {
  70. //获取到 转换的 bean
  71. StringBuffer stringBuffer = new StringBuffer();
  72. for (PsiClass psiClass : classesByName) {//处理多个相同的bean
  73. PsiField[] allFields = psiClass.getAllFields();//所有的类
  74. String name = psiClass.getName();//获取类的名字
  75. assert name != null;
  76. //concat 连接字符 没有StringBuffer好效率上
  77. String concatStart = name.concat(" ").concat(getLowOrUpStr(name,false)).concat("=").concat("new ").concat(name).concat("();");
  78. //创建 new 类
  79. stringBuffer.append("\t\t").append(concatStart).append("\n");
  80. for (PsiField allField : allFields) {
  81. //获取类中的所有修饰符
  82. PsiModifierList modifierList = allField.getModifierList();
  83. assert modifierList != null;
  84. //是否是静态的字段
  85. boolean isStatic = modifierList.toString().contains("static");
  86. if (isStatic) {
  87. continue;
  88. }
  89. //构造set方法
  90. String comUpStr = getLowOrUpStr(allField.getName(),true);
  91. assert aimName != null;
  92. String concatStr = getLowOrUpStr(name,false).concat(".set").concat(comUpStr).concat("(")
  93. .concat(aimName).concat(".get").concat(comUpStr)
  94. .concat("()").concat(");");
  95. stringBuffer.append("\t\t").append(concatStr).append("\n");
  96. }
  97. //换行
  98. stringBuffer.append("\n");
  99. }
  100. return stringBuffer;
  101. }
  102. /**
  103. * 写入到编辑器内容
  104. * @param project
  105. * @param editor
  106. * @param document
  107. * @param selectionModel
  108. * @param stringBuffer
  109. */
  110. private void writeEditorStr(Project project, Editor editor, Document document, SelectionModel selectionModel, StringBuffer stringBuffer) {
  111. //获取偏移量
  112. final int offset = editor.getCaretModel().getOffset();
  113. int lineNumber = document.getLineNumber(offset) + 1;
  114. int lineStartOffset = document.getLineStartOffset(lineNumber);
  115. //创建线程 输入到编译器中
  116. Runnable runnable = new Runnable() {
  117. @Override
  118. public void run() {
  119. //写入
  120. document.insertString(lineStartOffset, stringBuffer.toString());
  121. }
  122. };
  123. //执行写入
  124. WriteCommandAction.runWriteCommandAction(project, runnable);
  125. //移除掉选择的model
  126. selectionModel.removeSelection();
  127. }
  128. /**
  129. * 首字母变为大写,false 小写,true 大写
  130. * @param str
  131. */
  132. private String getLowOrUpStr(String str,boolean isLowOrUp) {
  133. assert str != null;
  134. String substringStr = str.substring(0, 1);
  135. String lowStr = !isLowOrUp?substringStr.toLowerCase():substringStr.toUpperCase();
  136. String substringEnd = str.substring(1, str.length());
  137. return lowStr + substringEnd;
  138. }
  139. /**
  140. * 获取事件的 PsiClass
  141. * @param e
  142. * @return
  143. */
  144. private PsiClass getPsiClassFromContext(AnActionEvent e,PsiFile psiFile,Editor editor) {
  145. if (psiFile == null || editor == null) {
  146. return null;
  147. }
  148. //获取插入的model,并获取偏移量
  149. int offset = editor.getCaretModel().getOffset();
  150. //根据偏移量找到psi元素
  151. PsiElement element = psiFile.findElementAt(offset);
  152. //根据元素获取到当前的上下文的类
  153. return PsiTreeUtil.getParentOfType(element, PsiClass.class);
  154. }
  155. /**
  156. *
  157. * 无用的东西
  158. * @param document
  159. * @param offset
  160. */
  161. private void noUse(Document document,int offset){
  162. //根据偏移量得到行数
  163. int lineNum = document.getLineNumber(offset);
  164. //获取当前行的偏移量
  165. int startOffset = document.getLineStartOffset(lineNum);
  166. CharSequence editorText = document.getCharsSequence();
  167. //获取文本的偏移量
  168. int wordStartOffset = getWordStartOffset(editorText, offset);
  169. //得到距离编译器的距离
  170. final int distance = wordStartOffset - startOffset;
  171. String blankSpace = "";
  172. for (int i = 0; i < distance; i++) {
  173. blankSpace = blankSpace + " ";
  174. }
  175. }
  176. /**
  177. * 得到插入代码的位置
  178. * @param editorText
  179. * @param cursorOffset
  180. * @return
  181. */
  182. private int getWordStartOffset(CharSequence editorText, int cursorOffset) {
  183. if (editorText.length() == 0) return 0;
  184. if (cursorOffset > 0 && !Character.isJavaIdentifierPart(editorText.charAt(cursorOffset))
  185. && Character.isJavaIdentifierPart(editorText.charAt(cursorOffset - 1))) {
  186. cursorOffset--;
  187. }
  188. if (Character.isJavaIdentifierPart(editorText.charAt(cursorOffset))) {
  189. int start = cursorOffset;
  190. //定位开始位置
  191. while (start > 0 && Character.isJavaIdentifierPart(editorText.charAt(start - 1))) {
  192. start--;
  193. }
  194. return start;
  195. }
  196. return 0;
  197. }
  198. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/650917
推荐阅读
相关标签
  

闽ICP备14008679号