1

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

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

@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 为我调用抽象类的激活方法?

4

2 回答 2

0

这与 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 容器也不能。

于 2013-10-18T13:05:10.857 回答
0

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

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

于 2013-10-18T12:33:47.560 回答