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、注釈を定義する
2.切断面と切断点を定義する
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");
}
}