2012-03-05 10 views
4

私のクラスでインターフェースを実装したいのですが、ある面でITDを使ったメソッドの実装を提供したいと思います。 これは可能ですか?AspectJ ITDs:汎用インターフェースの実装

インタフェース:

public interface CloningService<T> { 
    public T clone(T object); 
} 

デフォルトの実装:

public class DefaultCloningServiceImpl implements CloningService<T> { 
    public T clone(T object) { 
     // implementation of the clone method 
    } 
} 

具体的なインプリメンテーション:クラスPersonServiceは、それがCloningServiceインタフェースを実装することを宣言し

public class PersonService implements CloningService<Person> { 
    // no code (!) 
} 

が、実際の実装メソッドのDefaultCloningServiceImplで提供され、アスペクトはそれらをPersonServiceに導入します。

私はEclipse.comの例に従っており、@DeclareParentsを使用して上記の機能を実現しようとしました。しかし、AspectJからコンパイルエラーが発生しました。これはジェネリックスと関係があります。 @DeclareParentsアノテーションでジェネリックが使用されるとは思われないかのようです。

ありがとうございました。

答えて

2

注釈スタイルではなく、これを解決するために、コードスタイルaspectjを使用することをお勧めします。これは、このような側面を持っていることによって簡単に行うことができる

aspect CloningServiceAspect { 
    declare parents : PersonService extends DefaultCloningServiceImpl<Object>; 
} 

これは、より一般的な注釈に添付行うには、このような何か行うことができます。

aspect CloningServiceAspect { 
    declare parents : (@CloningService *) extends DefaultCloningServiceImpl<Object>; 
} 

をそして、もしこれをスタンドアロンのjarファイルにパッケージしたいと思っています。作成するすべてのコードを必ず追加して、このjarファイルをアスペクトパスに追加してください(コンパイル時のウィービングを使用している場合)。

+0

Andrew、あなたの答えに感謝します。これは良いアイデアのように思えますが、私は2つの質問があります:(1)アノテーションスタイルaspectjが好まれませんか?私の感動は、それがベストプラクティスであるということでした。 (2)あなたが提供したコードはPersonServiceを拡張しますが、私は別のJARにこのロジックを入れたいので、注釈でマークされたすべてのサービスを拡張したいと思います。私のためにはうまくいくだろうか? – anton1980

+1

いいえ、注釈スタイルは好ましくありません。 1つの理由から、ツールはアノテーションスタイルではうまく機能しません。また、アノテーションスタイルでは単純にできないものもあります(例:intertype宣言)。人々がコードスタイルよりもアノテーションスタイルを選択する主な理由は、標準のJavaコンパイラでコードをコンパイルできるようにすることです(そして、その上でウィーバーを実行します)。 –

+0

あなたの質問にもっと完全に答えるために上記の私の答えを展開しました。 –

1

解決策が見つかりました!

@Aspect 
public class CloningServiceAspect { 
    @DeclareMixin(value = "(@CloningService *)") 
    public static CloningService<?> createImplementation() { 
     return new DefaultCloningServiceImpl<Object>(); 
    } 
} 

そして私のサービスではなくインタフェースを実装する@CloningServiceでアノテートされています:それはクローン()メソッドのデフォルトの実装を混合するためにAspectJのから@DeclareMixinアノテーションを使用することを含む

@CloningService 
public class PersonService { 
    // no code 
} 
関連する問題