1

子クラスが拡張する抽象クラスがあります。私の抽象クラスには @Activate メソッドがあり、子クラスにもあります。OSGi がサービスを作成するとき、子クラスの activate メソッドを呼び出しますが、抽象クラスの activate メソッドは呼び出しません。子クラスで親の activate メソッドを手動で呼び出すのではなく、抽象クラスの 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!");
    }
}

上記のコードの結果は、"Hello World!" ではなく "World!" になります。

最初は、子のアクティブ化メソッド名が同じ名前の抽象アクティブ化メソッドを上書きしているのではないかと考えていました。抽象クラスの activate メソッドに一意の名前を付けても、結果は同じです。OSGi に抽象クラスの activate メソッドを呼び出させる方法はありますか?

4

2 に答える 2

0

DS 注釈プロセッサは、@Component で装飾された具象クラスのみを調べます。スーパークラスは検査されません。注釈処理はビルド時に行われるため、実行時まで選択されないインポートされたパッケージからスーパー タイプが取得される場合があります。

また、アノテーション プロセッサは、アノテーションからコンポーネント記述 XML を生成します。そのため、XML には activate="methodName" 属性を 1 つだけ含めることができます。スーパークラスのメソッドを呼び出す必要がある場合は、サブクラスのメソッドから呼び出す必要があります。

于 2013-10-18T12:33:47.560 に答える