当前位置: 首页 > news >正文

自己弄网站需要多少钱百度广告推广价格

自己弄网站需要多少钱,百度广告推广价格,哪做网站最好,wordpress 开发api我很喜欢IDEA的一键自动生成代码功能,例如自动生成构造方法、字段的Get/Set方法、ToString方法等等,除此之外,也有一些插件提供自动生成代码的功能,例如我们所熟悉的GsonFormat插件,使用该插件可以为我们快速的解析jso…

ec89780e7640dca71c778f5fb5ec7caf.png

我很喜欢IDEA的一键自动生成代码功能,例如自动生成构造方法、字段的Get/Set方法、ToString方法等等,除此之外,也有一些插件提供自动生成代码的功能,例如我们所熟悉的GsonFormat插件,使用该插件可以为我们快速的解析json字符串生成一个对应的Java类,这在对接一些第三方API时很有帮助。

笔者写过一个运行时根据json自动生成Class的工具包:json-class-generator,与GsonFormat不同的是,该工具使用ASM在运行时解析json结构树生成类的字节码,而GsonFormat生成的是Java源代码。当时写json-class-generator目的是实现一个第三方API自动对接框架,由于该框架涉及到业务,所以没有开源。

虽然json-class-generatorGsonFormat实现的功能不同,但原理相似。

上一篇我们了解到,Java源代码编译后生成的Class文件有固定的结构,而在IDEA中,Java源代码也同样有固定的结构:PSI程序结构。与使用ASM操作字节码修改一个Class文件一样,我们也可以通过编辑一个Java源代码的PSI程序结构的元素修改Java代码。

读懂本篇的前提是你已经对PSI有所了解

自动生成Java源代码

我们模仿IDEA提供的自动生成代码功能,给右键弹出菜单的Generate...菜单添加一个子菜单:GeneratedInvokePayMethod,在插件使用者点击该菜单时自动生成一串代码,并且生成的代码插入到当前光标所在位置。

首先需要编写一个对应GeneratedInvokePayMethod菜单的Action,并实现actionPerformed方法,代码如下。

public class GeneratedInvokePayMethodAction extends AnAction {@Overridepublic void actionPerformed(@NotNull AnActionEvent event) {}
}

actionPerformed方法在菜单被点击时调用,该方法只有一个参数:

  • event:这个参数封装了很多有用的信息,比如我们可以从该参数获取当前文件的PsiFile实例、获取当前光标落在的PsiElement等。

其次,我们需要注册Action,将Action放到右键弹出菜单的GenerateGroup。需要在plugin.xml文件添加如下配置信息:

<actions><action id="xxx.action.GeneratedInvokePayMethodAction" class="com.xxx.plugin.action.GeneratedInvokePayMethodAction"text="GeneratedInvokePayMethod"><!-- 将action放在哪 --><add-to-group group-id="GenerateGroup" anchor="first"/></action>
</actions>

效果如下图所示。

83b0a73170bc1f47bb84c55412866620.png

现在我们继续完成GeneratedInvokePayMethodActionactionPerformed方法。

由于Intellij Platform不允许插件在主线程中进行实时的文件写入,只能通过异步任务来完成写入,因此,我们需要通过WriteCommandAction.runWriteCommandAction来执行一个后台写入操作,如下代码所示。

public class GeneratedInvokePayMethodAction extends AnAction {@Overridepublic void actionPerformed(@NotNull AnActionEvent event) {// 立即执行一个后台任务WriteCommandAction.runWriteCommandAction(editor.getProject(), () -> {// do ...});}
}

想要在当前光标所在的位置插入一行代码,那么我们需要做这些事情:

  • 1、先判断当前文件是否是一个Java文件,借助actionPerformedevent参数可取得当前文件的PsiFile实例,判断PsiFile实例的类型是否为PsiJavaFile,如果不是,说明这不是一个Java代码文件,什么也不需要做(或者可以给出对话框提示);
// AnActionEvent event
PsiFile psiFile = event.getData(LangDataKeys.PSI_FILE);
  • 2、通过第一步获取的PsiFile,查找当前光标所在位置的PsiElement实例;
PsiElement element = psiFile.findElementAt(editor.getCaretModel().getOffset());

其中editor.getCaretModel().getOffset()为获取当前光标位置;

另外,可以使用AnActionEvent#getData方法获取当前光标所在的PsiElement,代码如下:

// AnActionEvent event
PsiElement psiElement = event.getData(LangDataKeys.PSI_ELEMENT);

但这种方式不适用于当前场景,如果将光标放在一行代码的;后面,那么该方法就会返回null值。

  • 3、根据光标所在的PsiElement,获取该PsiElement所在方法的PsiCodeBlock(一个方法只有一个PsiCodeBlock);
PsiElement codeBlock = element;
while (!(codeBlock instanceof PsiCodeBlock)) {codeBlock = codeBlock.getParent();
}
  • 4、创建新的PsiElement,该PsiElement就是需要自动生成的代码;例如创建一个表达式元素(PsiExpression),可使用PsiElementFactory#createExpressionFromText方法创建,代码如下。
PsiElement newElement = PsiElementFactory.getInstance(element.getProject()).createExpressionFromText("Invocation<Object> invocation = Invocation.<Object>builder()n" +"                .scope(scope)n" +"                .service(payType)" +"                .operate("" + method + "")n" +"                .body(merchantNo)n" +"                .build()", element.getContext());

PsiElementFactory使用工厂模式生产PsiElement,提供了大量的API,例如创建字段的createField、创建方法的createMethod、创建类的createClass,创建关键字的createKeyword

  • 5、最后,将新创建的PsiElement添加到光标所在PsiElement的后面;
// 参数1:新增的PsiElement
// 参数2:位置参照的PsiElement
codeBlock.addAfter(newElement, element);

完整示例代码如下。

public class GeneratedInvokePayMethodAction extends AnAction {@Overridepublic void actionPerformed(@NotNull AnActionEvent event) {WriteCommandAction.runWriteCommandAction(editor.getProject(), () -> {PsiFile psiFile = event.getData(LangDataKeys.PSI_FILE);// 查找当前光标停留在的元素PsiElement element = psiFile.findElementAt(editor.getCaretModel().getOffset());// 获取当前方法的PsiCodeBlock元素PsiElement codeBlock = element;while (!(codeBlock instanceof PsiCodeBlock)) {codeBlock = codeBlock.getParent();}// 使用PsiElementFactory创建表达式元素PsiElement newElement = PsiElementFactory.getInstance(element.getProject()).createExpressionFromText("Invocation<Object> invocation = Invocation.<Object>builder()n" +"                .scope(scope)n" +"                .service(payType)" +"                .operate("" + method + "")n" +"                .body(merchantNo)n" +"                .build()", element.getContext());// 将新创建的表达式元素插入到光标停留在的元素的后面codeBlock.addAfter(newElement, element);});}
}

后记

实际要实现一个插件可能没有那么简单,例如本篇没有介绍到的UI部分,笔者省略了一些步骤:当点击菜单时,先弹出一个Dialog,提供一些选项,在完成选项点击ok后再生成代码。

编写插件UI其实与开发Android应用编辑UI布局类似,如果你开发过Android应用,那么也就不难理解。


原作者:wujiuye
原文链接:编写一个IDEA插件之:自动生成Java代码
原出处:Java艺术
侵删

626fe6115a6be1a2d8ce97b28e48bb11.gif
http://www.wooajung.com/news/34561.html

相关文章:

  • 网站建设 聊城百度平台商家客服电话
  • 网站滚动栏特效模板html郑州网站设计有哪些
  • 网站增加二级域名网站策划书模板范文
  • web2.0网站开发网站怎么做推广和宣传
  • 成都营销型网站建设中账号洛阳网站建设
  • 网站建设将来有什么发展电脑培训班有哪些科目
  • wordpress收集访问量seo搜索引擎优化的内容
  • 网页游戏开发需要学什么广州抖音seo公司
  • 网站开发项目运营经理岗位职责义乌最好的电商培训学校
  • 潍坊地区制作网站营业推广策划方案
  • 对网站建设的问题百度竞价开户
  • 游戏网页设计素材企业搜索引擎优化
  • 网站首页用什么字体好seo网站建设优化什么意思
  • wordpress设置略缩图外链图片手机端seo
  • 番禺网站建设多少钱最新的域名网站
  • 做外贸的阿里巴巴网站是哪个好广州seo成功案例
  • 网站建设设seo网络优化平台
  • 中国建设委员会官网站360收录
  • 网站建设公司客户开发手册企业网站seo方案
  • 网站后台怎么建设360建站官网
  • 嘉定网站建设哪家便宜seo平台
  • macbook做网站windows7优化大师官方下载
  • 深圳企业做网站seo服务哪家好
  • 网站建设 新手从郑州网站运营专业乐云seo
  • 网上开店的货源渠道有哪些seo独立站
  • 兰州装修公司口碑排名seo排名优化有哪些
  • 青岛网景互联网站建设公司公司页面设计
  • 沈阳建设公司网站合肥网站制作推广
  • 深圳网站建公司seo运营是做什么的
  • 南阳网站排名优化报价河南网站建设哪个公司做得好