【问题标题】:Calling Abstract classes @Activate method (apache felix)调用抽象类@Activate 方法(apache felix)
【发布时间】:2013-10-26 12:54:43
【问题描述】:

我有一个子类扩展的抽象类。我的抽象类有一个@Activate 方法,子类也有。当 OSGi 创建我的服务时,它会调用子类的激活方法,但不会调用抽象类的激活方法。有没有办法强制OSGi调用抽象类的activate,而不是让子类手动调用父activate方法?

这里有一些代码可以帮助详细说明我的要求。

@Component(componentAbstract=true, inherit=true)
@Service(value=ISomeInterface)
public abstract class AbstractHello implements ISomeInterface{
    @Activate
    public void activate(){
        System.out.print("Hello ");
    }
}

@Component
@Service(Value=ISomeInterface)
public class World extends AbstractHello{
    @Activate
    public void activate(){
        System.out.println("World!");
    }
}

以上代码的结果将是“World!”,而不是“Hello World!”。

最初我认为可能是子激活方法名称破坏了同名的抽象激活方法。即使抽象类的激活方法被赋予一个唯一的名称,结果也是一样的。有什么方法可以让 OSGi 为我调用抽象类的 activate 方法?

【问题讨论】:

  • 如果以不同的方式命名方法以使子类不会覆盖父类会发生什么?
  • @SotiriosDelimanolis 更改抽象类的激活方法名称无效。尽管有激活注释,它仍然没有被 OSGi 调用。

标签: java osgi abstract-class apache-felix


【解决方案1】:

这与Apache Felix和OSGi无关,这是由于对Java中的类继承方法覆盖理解不佳造成的。

您的World 类扩展AbstractHello 类并覆盖其activate() 方法。如果你想调用 AbstractHello.activate() 方法,那么你必须在

中调用它
// Annotations excluded for readability.
public class World extends AbstractHello {
    public void activate() {
        super.activate();
        System.out.println("World!");
    }
}

OSGi 在这里帮不上忙。

更新

由于基类是abstract,并且你没有它的实例,你不能调用它的方法。 OSGi 容器也不能。

【讨论】:

  • 其实这一切都与Felix和OSGi有关。我很清楚我可以从子类调用 super.activate() 。 @Activate 注解在服务被激活时由 OSGi 调用。我的问题是 OSGi 会调用父抽象类中定义的任何激活方法,还是仅调用具体子类中定义的方法。答案似乎是它只会调用孩子的激活方法。
【解决方案2】:

DS 注释处理器只查看用@Component 修饰的具体类。不检查超类。由于注释处理是在构建时完成的,超类型可能来自导入的包,这些包直到运行时才被选择。

此外,注释处理器从注释生成组件描述 XML。所以 XML 中只能有一个 activate="methodName" 属性。如果你需要调用超类的方法,那么你需要从子类的方法中调用它。

【讨论】:

  • 谢谢。我将在我的子类中添加一个显式调用。
猜你喜欢
  • 2016-10-25
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
  • 2021-10-13
  • 2016-06-20
  • 2013-09-17
相关资源
最近更新 更多