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