AOPは切面プログラミング向けに簡単に使用


一、AOP紹介
1、AOPって何?
AOPはフェースプログラミング向けであり、JavaのOOPオブジェクトプログラミングと同様にプログラミング思想であり、一部の先行者はフェースプログラミング向けに言語を開発してサポートしている.
2、AOPの役割は何ですか.
プリコンパイルされた形式と実行期間のダイナミックエージェントにより、元の実行結果を変更します.
3、AOPの特徴は?
(1)原実行ロジックと接面ロジックをデカップリングする(2)ソースコードへの侵入性が低い(3)拡張しやすいアシスト機能(例えばAndroidの埋点,ジャンプ前のネットワークチェック,権限チェックなど,いずれも対象向けモジュール内のものではないが,各モジュール共通のものである)
4、AspectJの紹介
AspectJはJavaとほぼ同じプログラミング言語で、Javaと完全に互換性があります.AndroidではAspectJでAOPを実現するには2つの形式があり、1つ目はAspectJという言語を使用することです.2つ目は依然としてJava言語を使用し、Java言語にラベルを付け、AspectJのコンパイラに認識させることができます.AndroidでAspectJを使い、ホワイトポイントといえばポイントclassにコンパイルする過程でJavaのコンパイラではなくAspectJのコンパイラを使います.このコンパイラはJavaのコンパイラとあまり違いがありません.唯一、@Aspectラベルのクラスに基づいて、接点と接面を見つけて、接点マークされた注釈を逆押しして見つけて、これらの注釈を使う方法を見ます.次に、コードインプラントスキームを行います.本質的に性能の問題はありません.
二、Androidでの使用
1、注釈を定義する
/**
 * Target            ,   Method   。  、    、  、     
 * Retention        
 * 1、RUNTIME     ,    ,     ,     class    JVM
 * 2、CLASS     ,    ,     ,  JVM  class        
 * 3、SOURCE    ,    ,              
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AddPoint {
    String value();
}

2.切断面と切断点を定義する
/**
 * @Aspect            
 */
@Aspect
public class MyAspect {
    /**
     * @Pointcut     execution           
     * call          
     * get/set      、      
     * @com.zbh.aopdemo.AddPoint           ,      ,                          
     * * * (..)            ,       ,           
     */
    @Pointcut("execution(@com.zbh.aopdemo.AddPoint * * (..))")
    public void addPoint() {

    }

    /**
     * @Before      ,     ,          
     */
    @Before("addPoint()")
    public void testBefore() {
        Log.i("zhangbh", "Test Run Before");
    }

    /**
     * @Around      ,      ,                   ,  point.proceed()               
     * return null   ,             。        ,       @AddPoint("ABC"),                  
     * @AddPoint("Test")  ,        ,            
     */
    @Around("addPoint()")
    public Object dealPoint(ProceedingJoinPoint point) throws Throwable {
        MethodSignature ms = (MethodSignature) point.getSignature();
        AddPoint addPoint = ms.getMethod().getAnnotation(AddPoint.class);
        String value = addPoint.value();
        if ("Test".equals(value)) {
            Log.i("zhangbh", "Test Run Start");
            Object object = point.proceed();
            Log.i("zhangbh", "Test Run End");
            return object;
        }
        return null;
    }

    /**
     * @After      ,     ,          
     */
    @After("addPoint()")
    public void testAfter() {
        Log.i("zhangbh", "Test Run After");
    }
}