org.eclipse.ui.handlers扩展点参数机制及空参数问题排查
问题原因与扩展点参数工作机制
为什么event.getParameters()为空?
你在org.eclipse.ui.handlers扩展点的<class>节点下配置的<parameter>,不会被放入ExecutionEvent的参数集合中,所以调用event.getParameters()返回空集合是正常的。这类参数的作用是给Handler实例注入初始化数据,而非通过ExecutionEvent传递。
Handler扩展点参数的工作方式
Eclipse的Handler参数分为两类,工作机制完全不同:
- 扩展点配置的静态参数:就是你在
<class>下定义的<parameter>,这类参数是在Handler实例被创建时,通过依赖注入或接口回调的方式传递给Handler本身,用于初始化Handler的状态。 - 命令触发时的动态参数:这类参数才会出现在
ExecutionEvent.getParameters()中,通常来自:- 菜单/工具栏项(
org.eclipse.ui.menus扩展点)中<command>节点下的<parameter>配置 - 快捷键绑定(
org.eclipse.ui.bindings扩展点)中的参数配置 - 代码中调用
ICommandService.executeCommand(String commandId, Map parameters)时传入的参数
- 菜单/工具栏项(
获取扩展点静态参数的两种方法
如果你想获取配置的a=111参数,有两种标准实现方式:
方式1:使用@Parameter注解(推荐)
通过注解直接将参数注入到Handler的成员变量中:
public class TestHandler extends AbstractHandler { // 注解name要和扩展点中parameter的name一致 @Parameter(name = "a") private String aParam; @Override public Object execute(ExecutionEvent event) throws ExecutionException { // 直接使用注入后的参数值 System.out.println(aParam); // 输出111 return null; } }
方式2:实现IExecutableExtension接口
通过接口回调获取初始化参数:
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExecutableExtension; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.ui.handlers.AbstractHandler; import java.util.Hashtable; public class TestHandler extends AbstractHandler implements IExecutableExtension { private String aParam; @Override public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException { // data就是扩展点中配置的参数集合 if (data instanceof Hashtable) { aParam = (String) ((Hashtable) data).get("a"); } } @Override public Object execute(ExecutionEvent event) throws ExecutionException { System.out.println(aParam); // 输出111 return null; } }
验证ExecutionEvent.getParameters()的场景
如果想让event.getParameters()有值,可以在菜单中配置命令动态参数,示例如下:
<extension point="org.eclipse.ui.menus"> <menuContribution locationURI="menu:org.eclipse.ui.main.menu"> <command commandId="com.abc.test.command" label="Test Command"> <parameter name="dynamicParam" value="dynamicValue"/> </command> </menuContribution> </extension>
此时点击该菜单触发命令,event.getParameters()中就会包含{"dynamicParam": "dynamicValue"}的键值对。
内容的提问来源于stack exchange,提问作者Bourbon_7
相关产品推荐
相关产品推荐

