是五月呀!

IDEA插件开发(三)扩展点

IDEA提供扩展点的概念,这样我们可以跟其他插件或者IDEA本身交互,例如对IDEA功能进行扩展。

扩展点Extension points

如果希望你的插件可以被其他插件扩展功能,那么可以在插件中声明extension points。每个扩展点定义一个可以访问它的类或者接口。

1
2
3
4
<extensionPoints>
<extensionPoint name="MyExtensionPoint1" beanClass="MyPlugin.MyBeanClass1">
<extensionPoint name="MyExtensionPoint2" interface="MyPlugin.MyInterface">
</extensionPoints>

  • interface属性设置一个接口,扩展时需要实现此接口
  • beanClass属性设置一个bean类,包含使用@Attribute注解标注的属性。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class MyBeanClass1 extends AbstractExtensionPointBean {
@Attribute("key")
public String key;
@Attribute("implementationClass")
public String implementationClass;
public String getKey() {
return key;
}
public String getClass() {
return implementationClass;
}
}

如果要扩展它,需要包含keyimplementationClass属性。(见下文)

扩展Extensions

如果希望扩展别的插件或者IDEA的功能,那么可以声明extensions
在注册extensions元素时,需要设置defaultExtensionNs属性为如下两个值之一:

  • com.intellij:扩展IDEA功能
  • {ID of a plugin}:扩展其他插件的功能

例如,我们要扩展IDEA的appStarterapplicationConfigurable扩展点,还有上面我们声明的MyExtensionPoint1扩展点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- Declare extensions to access extension points in the IntelliJ Platform.
These extension points have been declared using the "interface" attribute.
-->
<extensions defaultExtensionNs="com.intellij">
<appStarter implementation="MyTestPackage.MyTestExtension1" />
<applicationConfigurable implementation="MyTestPackage.MyTestExtension2" />
</extensions>
<!-- Declare extensions to access extension points in a custom plugin
The MyExtensionPoint1 extension point has been declared using *beanClass* attribute.
-->
<extensions defaultExtensionNs="MyPluginID">
<MyExtensionPoint1 key="keyValue" implementationClass="MyTestPackage.MyClassImpl"></MyExtensionPoint1>
</extensions>

IDEA扩展点列表