Aspectj簡單使用(一)
阿新 • • 發佈:2018-12-17
Aspectj切面程式設計,舉個例子,當你要統計多個方法單獨的執行時間,你應該會在每個方法中都有一個記錄執行前的時間和執行後的時間,當要修改統計時間的方法時,你就要每個方法中去修改,很麻煩,看看用Aspectj怎麼做。
MainActivity
public class MainActivity extends AppCompatActivity { static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @BehaviorTrace("搖一搖") public void mShake(View btn){ SystemClock.sleep(new Random().nextInt(500)); Log.d(TAG, "搖一搖功能被使用"); } @BehaviorTrace(value = "傳送語音") public void mAudio(View btn){ SystemClock.sleep(new Random().nextInt(500)); Log.d(TAG, "語音訊息功能被使用"); } public void mVideo(View btn){ long begin = System.currentTimeMillis(); { SystemClock.sleep(new Random().nextInt(500)); Log.d(TAG, "視訊通話功能被使用"); } long duration = System.currentTimeMillis() - begin; Log.d(TAG, "視訊通話功能被使用,耗時:" + duration); } }
BehaviorAspect.java
@Aspect
public class BehaviorAspect {
private static final String TAG = "BehaviorAspect";
//切面有哪些方法組成 //只要標註了BehaviorTrace的方法,這個方法就屬於這個切面
@Pointcut("execution(@com.jsonaop.annotation.BehaviorTrace * *(..))")
public void annoBehavior(){
}
//針對切面進行程式設計 onShake方法會到這個方法中執行
@Around("annoBehavior()") //環繞切點
public Object joinPoint(ProceedingJoinPoint joinPoint) throws Throwable{
Log.d("BehaviorAspect","走我了");
long begin = System.currentTimeMillis();
//方法執行時
Object object=null;
try {
object=joinPoint.proceed();//執行這句程式碼,mShake方法會執行
}catch (Exception e)
{
}
long duration = System.currentTimeMillis() - begin;
//獲取功能名稱
MethodSignature singnature = (MethodSignature) joinPoint.getSignature();
Log.d(TAG,singnature.getName());
BehaviorTrace behaviorTrace = singnature.getMethod().getAnnotation(BehaviorTrace.class);
// Log.e(TAG,behaviorTrace.toString()); 這裡behaviorTrace為空了,目前不知道原因
// String funcName = behaviorTrace.value();
//一般可以寫入資料庫
Log.d("BehaviorAspect", String.format("%s功能被執行, 耗時: %d", "", duration));
return null;
}
}
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.METHOD)
public @interface BehaviorTrace {
String value();
}
感覺一下是不是很巧妙
參考地址:http://blog.csdn.net/hpc19950723/article/details/71250514
程式碼地址:https://github.com/firsthubgit/AspectjSimpleUse
注意配置gradle