AspectJの接点構文

3186 ワード

AspectJの概要
AOPは方法論ですが、OOPのJavaのように、一部の先行者もAOPをサポートするために言語を開発しました.現在使われているのはAspectJです.Javaとほぼ同じ言語で、Javaと完全に互換性があります(AspectJは拡張Javaのはずですが、Groovyのような拡張ではありません).もちろん、AspectJの特殊な言語のほか、AspectJはオリジナルのJavaもサポートしており、対応するAspectJ注釈を加えればよい.したがって、AspectJを使用するには2つの方法があります.1.AspectJの言語を完全に使用します.この言語は少しも難しくなく、Javaとほぼ同じで、AspectJでJavaのクラスライブラリを呼び出すこともできます.AspectJはキーワードが少し増えただけです.2.または純粋なJava言語で開発し、その後AspectJ注釈、略称@AspectJを使用する.
AspectJは現在Eclipseプロジェクトに管理されており、公式サイトは以下の通りです.
  • AspectJ公式サイト
  • AspectJクラスライブラリリファレンスドキュメント、内容が非常に少ない
  • @AspectJドキュメント、以降はAnnotation方式で最大
  • 詳細は、AndroidのAOPを詳しくご理解ください
    簡単なプログラムで最も簡単なAspectJ構文を見てみましょう.
        @Aspect
        public class AspectJTest {
            private static final String TAG ="AspectJTest" ;
    
            @Before("execution (* android.app.Activity.on**(..))")
            public void onActivityMethodBefore(JoinPoint joinPoint) throws Throwable{
                  Log.e(TAG,joinPoint.getSignature().toString()+":beforecall");            }
        }
    
  • @Aspect:注記これはAspectJファイルであることを示し、コンパイラはコンパイル時に自動的に解析し、対応するJPonitにコードを注入します.
  • @Before:Advice、すなわち具体的な挿入点.
  • execution:処理JPointのタイプ、例えばcall,execution
  • (*android.app.Activity.on*(.):これは最も重要な式です.最初の[]は戻り値を表し、*は任意のタイプを返し、後のandroid.app.Activity.on**は典型的なパッケージ名パスを表します.ここでは*を使用してプロビジョニングできますが、いくつかの*には違いはありません.また、ここでは&&,|,!条件の組み合わせとしては、例えば、@Before("execution(android.app.Activity.onCreate(.)|"+"execution(*android.app.Activity.onDestroy()")public void onActivity MethodBefore(JoinPoint joinPoint)throws Throwable{Log.e(TAG,joinPoint.getSignature().toString()+":beforecall");
    上記の例から,前に用いたAOPコード注入法は,対応するpointcutを直接指定して切り込みを行うことが分かる.この場合、ある関数にコードを切り込む必要がある場合は、対応するpointcutを書き直し、メソッドを書き直してコードを切り込む必要があります.では、もっと便利な方法はありませんか.直接指定してコードの切り込みを実現するのに便利ですか.上記の必要な機能は、Pointcutsをカスタマイズすることによって実現することができる.
    カスタムPointcuts
    カスタムPointcutsは、1つ以上の指定された切り込みポイントにより正確に切り込むことができます.1.まず、注釈クラスをカスタマイズする必要があります.
    @Retention(RetentionPolicy.CLASS)
    @Target({ElementType.CONSTRUCTOR,ElementType.METHOD})
    public @interface AopLog {}
    

    2.次に、カスタム注釈クラスAopLog注釈を含むすべての方法を指定するPointcutを使用して、断面ファイルを作成します.
        @Aspect
        public class AopLogPointcut {
            //   AopLog         ( :    * *         )
            @Pointcut("execution(@com.yn.aspectj.selfmakeaop.AopLog * *(..))")
            public void logPointcut(){} //  ,          ,  Java      
    
            @After("logPointcut()")
            public void onLogPointcutAfter(JoinPoint joinPoint) throws Throwable{
                Log.i("AOP","onLogPointcutAfter:"+joinPoint.getSignature());
                }
        }
    

    3.最後に、切り込みを行う関数に@AopLog注記を付けるだけです.public class MainActivity extends Activity {
             @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                testAopLog();
            }
    
            @AopLog
            public void testAopLog() {
                Log.i("AOP","in testAopLog");
            }
        }
    

    上記の方法をマスターすれば、AOP基本プログラミングが使えます.