2016-09-22 12 views
1

アノテーション付きメソッドを呼び出す前に、他のいくつかのメソッドを呼び出すには:のJavaカスタムアノテーションは、私のようなものに見えるカスタムアノテーションを実装しようとしています

実際の方法がある前に、アノテーションで指定されたメソッドが呼び出されるべき

public class Foo{ 

@CustomAnnotation(classname="com.somepackage.ExternalClass", methodname="method1", invokation="before") 
public void bar(){ 
    //method body.. 
    } 
} 
呼び出される。 これを達成する方法をお勧めします。

+0

IMOあなたがここでやっていることは多くの意味がありません。あなたはAOPを使ってもっと簡単にできることを再実装しようとしています。しかし、AOPを使用する場合、主要なアプリケーションコードをクロスカッティングの問題を適用する方法に関する情報で汚染するのはなぜですか?きれいな解決策は、この情報を側面自体に完全に外部化し、反射魔法を取り除くことです。あなたが、私が話していることの単純なAspectJの例を見たいかどうか、私に知らせてください。 – kriegaex

答えて

1

あなたはここで何を達成しようとしていますか?なぜメソッド本体の中からメソッドを呼び出すだけではないのですか?

注釈はコンパイル中に処理され、実行時に有効になります(有効期間が実行時に設定されている場合)。コンパイル時にコードを生成したり、他のコードがクラスをどのように扱うかに影響を与えることができますが、アノテーション処理中に既存のクラスを変更することはできません。

唯一可能なのは、そのメソッドを単一の場所から呼び出している場合のみ、その注釈をチェックしてそのメソッドを呼び出すことができます(メソッドを呼び出すためにリフレクションを使用します)。 JUnitの動作(@Testと@ Before/@ Afterアノテーション)

0

これは、AOP(AspectJまたはSpringまたはSpring + AspectJ)を使用して行うことができます。問題の可能性があるのは、beforeafteraroundなどがあなたの面でハードコードされているので、invokation="before"注釈パラメータです。以下 AspectJのコード例:

public aspect CustomAnnotationAspect { 

    pointcut customAnnotationPointcut(Object t, CustomAnnotation annotationValue): execution(@CustomAnnotation * *.*(..)) && @this(annotationValue) && target(t); 

    before(Object target, CustomAnnotation annotationValue): customAnnotationPointcut(target, annotationValue) { 
     String className = annotationValue.className(); 
     String methodName = annotationValue.methodName(); 
     //do some reflection staff for className.methodName() invocation 
    } 

} 
関連する問題