调用抽象类@Activate方法(apache felix)

时间:2013-10-17 20:38:58

标签: java osgi abstract-class apache-felix

我有一个子类扩展的抽象类。我的抽象类有一个@Activate方法,子类也是如此。当OSGi创建我的服务时,它会调用子类的activate方法,但不会激活抽象类。有没有办法强制抽象类的激活被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为我调用抽象类的激活方法?

2 个答案:

答案 0 :(得分:0)

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

此外,注释处理器根据注释生成组件描述XML。因此XML中只能有一个activate =“methodName”属性。如果需要调用超类'方法,则需要从子类'方法中调用它。

答案 1 :(得分: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在这里无法帮助。

<强>更新

由于基类是抽象,并且您没有它的实例,因此无法调用其方法。 OSGi容器也不能。