开发IDEA定位到.class文件的插件(一)项目配置及原理详细记录
项目配置及原理详细记录
项目结构
HelloAction.java
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
public class HelloAction extends AnAction {
public HelloAction() {
super("Hello");
}
@Override
public void actionPerformed(AnActionEvent anActionEvent) {
Project project = anActionEvent.getProject();
Messages.showMessageDialog(project, "Hello world!", "Greeting", Messages.getInformationIcon());
}
}
Action在IDEA中,(⊙o⊙)…就是Action吧,你可以翻译过来叫做动作,是IDEA对动作的抽象。
AnAction是一个比较重要的抽象类,一般复写其actionPerformed方法,即可实现一些操作。它还有一个update方法可以复写,这里不讨论,可参见AnAction的类注释,有例子。
看一下代码:
1、通过事件获取到当前的project
2、通过调用Messages.showMessageDialog弹出一个对话框,显示的内容是Hello world!
showMessageDialog的方法签名:
小结:HelloAction被触发后,会弹出一个对话框,显示Hello world!
plugin.xml
<idea-plugin>
<id>com.rong.kim.open_class_file</id>
<name>Plugin display name here</name>
<vendor email="[email protected]" url="http://www.yourcompany.com">YourCompany</vendor>
<description><![CDATA[
Enter short description for your plugin here.<br>
<em>most HTML tags may be used</em>
]]></description>
<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
on how to target different products -->
<!-- uncomment to enable plugin in all products
<depends>com.intellij.modules.lang</depends>
-->
<!-- <depends>com.intellij.modules.lang</depends>-->
<extensions defaultExtensionNs="com.intellij">
<!-- Add your extensions here -->
</extensions>
<actions>
<!-- Add your actions here -->
<group id="MyPlugin.SampleMenu" text="Greeting" description="Greeting menu">
<add-to-group group-id="MainMenu" anchor="last"/>
<action id="Myplugin.Textboxes" class="HelloAction" text="Hello" description="Says hello"/>
</group>
</actions>
</idea-plugin>
另外一个文件,plugin.xml,这个文件通过配置来注册我们写的action,
1、主要看actions标签内的group标签:
<group id="MyPlugin.SampleMenu" text="Greeting" description="Greeting menu">
<add-to-group group-id="MainMenu" anchor="last"/>
<action id="Myplugin.Textboxes" class="HelloAction" text="Hello" description="Says hello"/>
</group>
使用add-to-group标签,将我们的group加到一个已有的group,这个已有的group-id为MainMenu,锚点为last。
锚点我的理解应该是扩展的位置,但是是显示的位置,还是加载的时机?这个后面慢慢用起来应该就知道了,先留着。
小结:我们的group是注册到主菜单上的
2、action标签配置的是HelloAction,注意这里class属性的值没有配置全限定名,最好是配一下,感觉更靠谱,因为不配全限定名,它内部解析的时候还是要去通过全限定名找HelloAction的二进制.class文件,不配会多一个查找全限定名的步骤。我这里是官方示例,如果自己开发在说吧,这个只是个人建议,喜好问题,不做进一步讨论了。
项目地址: