Java 关于如何在Eclipse4中使用IContextFunction的示例

Java 关于如何在Eclipse4中使用IContextFunction的示例,java,eclipse,eclipse-plugin,osgi,eclipse-rcp,Java,Eclipse,Eclipse Plugin,Osgi,Eclipse Rcp,我读过关于org.eclipse.e4.core.contexts.IContextFunction的文章,但在网上找不到实际的例子。 我的理解是,一个组件实现了一个IContextFunction,在调用compute时,另一个对象被延迟创建。 但是我不清楚如何/何时调用compute方法。 例如: <?xml version="1.0" encoding="UTF-8"?> <scr:component xmlns:scr="http://www.osgi.org/xm

我读过关于org.eclipse.e4.core.contexts.IContextFunction的文章,但在网上找不到实际的例子。
我的理解是,一个组件实现了一个
IContextFunction
,在调用
compute
时,另一个对象被延迟创建。
但是我不清楚如何/何时调用
compute
方法。
例如:

<?xml version="1.0" encoding="UTF-8"?>  
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0"   
  name="com.example.e4.rcp.todo.contextservice.translate">  

<implementation class="com.example.e4.rcp.todo.contextservice.Test"/>  

 <service>  
   <provide interface="org.eclipse.e4.core.contexts.IContextFunction"/>  
 </service>  

 <property name="service.context.key" type="String"   
   value="com.example.e4.rcp.todo.contextservice.test"/>  

</scr:component>   

必须有人调用
com.example.e4.rcp.todo.contextservice.test
才能调用
compute
,但我不清楚如何使用它。

有人有参考范例吗

这是注射到POJO中的东西。 例如


是的,我在谷歌搜索了很多次后找到了你发布的第二个示例。但是找不到关于第一个示例的任何信息。对于第一个示例,名为的变量的
Inject
什么时候会发生?只要你的pojo被实例化并且在DI引擎的控制下,它就会发生。不过,如果您知道第二个示例是如何使用的,那么第一个示例几乎是相同的。不同之处在于,您可以在test()方法中做更多的事情,而不仅仅是设置/注入@Named字段。例如,您可以在命令处理程序中使用“com.example.e4.rcp.todo.contextservice.test”对象……当您说
POJO
时,您是指
yourObject
还是将
yourObject
作为成员的类?因为如果我执行
ctx.get(“com.example.e4.rcp.todo.contextservice.test”)
成员
yourObject
不会自动注入,对吗?这就是为什么在第二个示例中显式填充的原因。第一个示例适用于在
ctx.get(“com.example.e4.rcp.todo.contextservice.test”)之后实例化具有
yourObject
作为成员的对象的情况在代码中的某个地方被调用?在第一个示例中仍然不清楚。POJO=需要yourObject的类。您可能想看看这个:(参见底部的“注射顺序”)。现场注入将在方法注入之前进行。也就是说,如果您调试并向test()添加断点,那么该字段应该已经被注入。因此,您是说调用
ctx.get
是案例1必须的,对吗?
public class YourPojo {
   @Inject
   @Named("com.example.e4.rcp.todo.contextservice.test")
   private Object yourObject;
}
public class YourPojo {
   @Inject
   public void test(IEclipseContext ctx) {
        Object yourObject = ctx.get("com.example.e4.rcp.todo.contextservice.test");
   }
}
public class YourPojo {
   @Inject
   public void test(@Named("com.example.e4.rcp.todo.contextservice.test") Object yourObject) {
      // consume yourObject
   }
}