0 引入包
根目錄下的build.gradle中阅酪,dependencies添加以下兩個依賴,很多網(wǎng)上文章說只需依賴第一個察绷,運(yùn)行時候會報錯:
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.1.0'
classpath 'org.aspectj:aspectjtools:1.8.14'
然后再主項目或者庫的build.gradle中增加AspectJ的依賴:
compile 'org.aspectj:aspectjrt:1.8.14'
同時在build.gradle中加入AspectJX模塊:
apply plugin: 'android-aspectjx'
1 定義切面類
TestAnnoAspect
@Aspect
public class TestAnnoAspect {
private static final String TAG = "jack";
@Before("execution(* com.jack.aop.MainActivity.onCreate(..))")
public void onActivityMethodBefore(JoinPoint joinPoint) throws Throwable {
String key = joinPoint.getSignature().toString();
Log.d(TAG, "onActivityMethodBefore: " + key);
}
@After("execution(* android.app.Activity.onResume(..))")
public void onActivityMethodafter(JoinPoint joinPoint) throws Throwable {
String key = joinPoint.getSignature().toString();
Log.d(TAG, "onActivityMethodafter: " + key);
}
}
在類的最開始干签,我們使用@Aspect注解來定義這樣一個AspectJ文件,編譯器在編譯的時候拆撼,就會自動去解析容劳,并不需要主動去調(diào)用AspectJ類里面的代碼。
MainActivity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
經(jīng)過編譯后:MainActivity.class
public class MainActivity
extends AppCompatActivity
{
private static final JoinPoint.StaticPart ajc$tjp_0;
private static final JoinPoint.StaticPart ajc$tjp_1;
private static void ajc$preClinit()
{
Factory localFactory = new Factory("MainActivity.java", MainActivity.class);
ajc$tjp_0 = localFactory.makeSJP("method-execution",
localFactory.makeMethodSig("4", "onCreate", "com.jack.aop.MainActivity",
"android.os.Bundle", "savedInstanceState", "", "void"), 11);
ajc$tjp_1 = localFactory.makeSJP("method-execution",
localFactory.makeMethodSig("4", "onResume", "com.jack.aop.MainActivity",
"", "", "", "void"), 18);
}
protected void onCreate(Bundle savedInstanceState)
{
Bundle localBundle = savedInstanceState;
JoinPoint localJoinPoint = Factory.makeJP(ajc$tjp_0, this, this, localBundle);
TestAnnoAspect.aspectOf().onActivityMethodBefore(localJoinPoint);
super.onCreate(savedInstanceState);
setContentView(2131296283);
}
protected void onResume()
{
JoinPoint localJoinPoint = Factory.makeJP(ajc$tjp_1, this, this);
try
{
super.onResume();
}
catch (Throwable localThrowable)
{
TestAnnoAspect.aspectOf().onActivityMethodafter(localJoinPoint);throw localThrowable;
}
TestAnnoAspect.aspectOf().onActivityMethodafter(localJoinPoint);
}
static {}
}
可以看到在onCreate和onResume中插入了代碼闸度。
完畢