AndroidStudio中有许多插件,比如生成set/get方法、生成toString方法等,这些插件可以辅助我们进行快捷的开发。
我们也可以自己开发插件,比如我们想在一个model类中,自动生成所有private变量的get方法,当然AndroidStudio自带插件已经支持了,这里我们只是以这个例子为入手点,看下如何开发一个IDE插件。
首先去官网下载IntelliJ IDEA开发工具,初始配置时,点击右下角Configuration的Structure For New Projects设置面板。
然后在SDKs选项里,配置一个新的Plugin SDK版本。
IDE环境搭建好后,我们开始创建一个Plugin插件项目,并确保SDK版本正确,然后进行下一步。
然后就是输入project名称即可完成创建。
我们先来看下生成的project结构。
其实就是有一个plugin.xml,估计都能猜到,这个文件就是插件的配置文件。
<idea-plugin>
<id>com.your.company.unique.plugin.idid>
<name>GenerateGetMethodPluginname>
<version>1.0version>
<vendor email="[email protected]" url="http://www.yourcompany.com">YourCompanyvendor>
<description>
most HTML tags may be used
]]>description>
<change-notes>
most HTML tags may be used
]]>
change-notes>
<idea-version since-build="173.0"/>
<depends>com.intellij.modules.platformdepends>
<extensions defaultExtensionNs="com.intellij">
extensions>
<actions>
actions>
idea-plugin>
配置内容很简单,都是一些插件的基本信息就不赘述了;底部的actions
标签,就是我们稍后要添加的插件具体功能,我们管每一个插件的功能叫做一个Action,所以一个插件中,可以定义多个Action。
我们在包中,右键创建一个Action类。
弹窗中,我们需要配置Action的各种参数。
创建好后,会生成一个GenerateGetMethodAction的类,同时在plugin.xml配置文件中自动进行了配置。
<actions>
<action id="GenerateGetMethodAction.Plugin" class="com.cwj.plugin.GenerateGetMethodAction" text="GenerateGetMethod"
description="GenerateGetMethod">
<add-to-group group-id="GenerateGroup" anchor="first"/>
action>
actions>
下面开始正式开发我们的功能,首先生成的Action类,需要我们实现actionPerformed方法。
public class GenerateGetMethodAction extends AnAction {
@Override
public void actionPerformed(AnActionEvent anActionEvent) {
}
}
该方法的AnActionEvent参数,可以获取当前执行环境的各种信息,比如:
anActionEvent.getData(LangDataKeys.PSI_FILE)
获取当前操作的文件,是一个PsiFile类型anActionEvent.getData(LangDataKeys.EDITOR)
获取当前鼠标的光标信息那么我们需要怎么做呢?
首先应该要获取当前所在的model类文件:
PsiFile psiFile = anActionEvent.getData(LangDataKeys.PSI_FILE);
为了获取该文件对应的各种类信息,需要转换为PsiClass对象进行操作:
if (psiFile instanceof PsiJavaFile) {
PsiClass[] classes = ((PsiJavaFile) psiFile).getClasses();
if (classes.length > 0 && classes[0] != null) {
PsiClass psiClass = classes[0];
}
}
有了class后,就可以获取类的所有field,并且我们只需要过滤出private且非static的field:
Arrays.stream(psiClass.getFields())
.filter(it -> it != null && it.hasModifierProperty(PsiModifier.PRIVATE) && !it.hasModifierProperty(PsiModifier.STATIC))
拿到应该生成get方法的field后,以字符串的形式生成get方法即可:
List<String> methods = Arrays.stream(psiClass.getFields())
.filter(it -> it != null && it.hasModifierProperty(PsiModifier.PRIVATE) && !it.hasModifierProperty(PsiModifier.STATIC))
.map(psiField -> {
String name = psiField.getName();
return "public " + psiField.getType().getCanonicalText() +
" get" + name.substring(0, 1).toUpperCase() + name.substring(1) +
"() { return this." + name + "; }";
}).collect(Collectors.toList());
我们拿到了所有要生成的get方法字符串形式集合,最后一步就是添加到PsiClass中:
new WriteCommandAction(psiFile.getProject(), psiFile) {
@Override
protected void run(@NotNull Result result) throws Throwable {
PsiElementFactory psiElementFactory = PsiElementFactory.SERVICE.getInstance(psiFile.getProject());
methods.forEach(s -> {
psiClass.add(psiElementFactory.createMethodFromText(s, psiClass));
});
}
}.execute();
WriteCommandAction
类至此,一个简单的生成get方法的插件就完成了!
插件完成后,我们就可以制定版本号并发布,版本号在上述的xml配置文件中指定即可。
发布时,我们可以上传到官方仓库,这里我们只上传到本地即可:点击菜单栏的Build-Prepare Plugin Module xxx For Deployment,即可发布到本地,默认位置为项目根目录中,是一个jar包。
在AndroidStudio中,我们可以通过IDE的Preferences进入到Plugin设置,选择从本地磁盘加载插件即可。
最后重启AndroidStudio,插件就生效了!
参考资料: