我有一个子类扩展的抽象类。我的抽象类有一个@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为我调用抽象类的激活方法?
答案 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容器也不能。