(4.6.23.3)Android之面向切面编程:Aspect示例之继承关系测试

1. JoinPoint获取的参数是值or引用

目标为:checkInput(int i,StringBuilder stringBuilder )函数
说明:函数执行期间修改参数
测试:参数是基本类型则为值传递;对象则为引用传递

        int i = 1;
        StringBuilder stringBuilder = new StringBuilder("a");
        checkInput(i, stringBuilder);

    private void checkInput(int i,StringBuilder stringBuilder ) {
        i=2;
        stringBuilder.append("b");
    }
    /***
     * 获取函数的输入参数
     * 证明:拿到的就是输入值的地址
     * 如果是值传递,则不会干扰,也就是说,函数体内修改后,after之后还是原来的值;
     * 引用传递会干扰;
     */
    public static final String TAG_CHECKINPUT = "CheckInput";
    @Before("execution(* sangfor.com.aop.activity.MainActivity.checkInput(..))")
    public void methodBeforecheckInput(JoinPoint joinPoint) throws Throwable {
        String key = joinPoint.getSignature().toString();
        Log.d("MainActivity", "methodBeforecheckInput: " + key);
        for (int i = 0; i < joinPoint.getArgs().length; i++) {
            //两个参数  一个是值传递  一个是引用传递
            Log.d(TAG_CHECKINPUT, "methodBeforecheckInput():" + joinPoint.getArgs()[i].toString());
        }
    }

    @After("execution(* sangfor.com.aop.activity.MainActivity.checkInput(..))")
    public void methodAftercheckInput(JoinPoint joinPoint) throws Throwable {
        for (int i = 0; i < joinPoint.getArgs().length; i++) {
            //两个参数  一个是值传递  一个是引用传递
            Log.d(TAG_CHECKINPUT, "methodAftercheckInput():"+joinPoint.getArgs()[i].toString());
        }
    }
04-21 03:12:48.896 2692-2692/sangfor.com.aop D/CheckInput: methodBeforecheckInput():1
04-21 03:12:48.896 2692-2692/sangfor.com.aop D/CheckInput: methodBeforecheckInput():a
04-21 03:12:48.896 2692-2692/sangfor.com.aop D/CheckInput: methodAftercheckInput():1
04-21 03:12:48.896 2692-2692/sangfor.com.aop D/CheckInput: methodAftercheckInput():ab

2. execution 与 call的不同

call是调用位置
execution 是函数位置

    public void testAOP() {
        Log.d("MainActivity", "testAOP");
    }
    /***
     * execution 与 call的不同
     */
    public static final String TAG_CHECKEC = "CheckExceAndCall";
    @Before("execution(* sangfor.com.aop.activity.MainActivity.testAOP(..))")
    public void methodExecutionAOPTest(JoinPoint joinPoint) throws Throwable {
        String key = joinPoint.getSignature().toString();
        Log.d(TAG_CHECKEC, "methodExecutionAOPTest: "
                + "\n Signature-" +key
                + "\n SignatureDeclaringTypeName-" + joinPoint.getSignature().getDeclaringTypeName()
                + "\n SignatureDeclaringType-" + joinPoint.getSignature().getDeclaringType()
                + "\n SignatureName-" + joinPoint.getSignature().getName()
                + "\n SourceLocation-" + joinPoint.getSourceLocation()
                + "\n SourceLocationFileName-" + joinPoint.getSourceLocation().getFileName()
                + "\n SourceLocationLine-" + joinPoint.getSourceLocation().getLine()
                + "\n SourceLocationWithinType-" + joinPoint.getSourceLocation().getWithinType()
                + "\n Target-" + joinPoint.getTarget()
                + "\n This-" + joinPoint.getThis()
                + "\n Kind-" + joinPoint.getKind());
    }

    @Before("call(* sangfor.com.aop.activity.MainActivity.testAOP(..))")
    public void methodCallAOPTest(JoinPoint joinPoint) throws Throwable {
        String key = joinPoint.getSignature().toString();
        Log.d(TAG_CHECKEC, "methodExecutionAOPTest: "
                + "\n Signature-" +key
                + "\n SignatureDeclaringTypeName-" + joinPoint.getSignature().getDeclaringTypeName()
                + "\n SignatureDeclaringType-" + joinPoint.getSignature().getDeclaringType()
                + "\n SignatureName-" + joinPoint.getSignature().getName()
                + "\n SourceLocation-" + joinPoint.getSourceLocation()
                + "\n SourceLocationFileName-" + joinPoint.getSourceLocation().getFileName()
                + "\n SourceLocationLine-" + joinPoint.getSourceLocation().getLine()
                + "\n SourceLocationWithinType-" + joinPoint.getSourceLocation().getWithinType()
                + "\n Target-" + joinPoint.getTarget()
                + "\n This-" + joinPoint.getThis()
                + "\n Kind-" + joinPoint.getKind());
    }
04-21 03:16:20.606 6882-6882/sangfor.com.aop D/CheckExceAndCall: methodExecutionAOPTest: 
                                                                  Signature-void sangfor.com.aop.activity.MainActivity.testAOP()
                                                                  SignatureDeclaringTypeName-sangfor.com.aop.activity.MainActivity
                                                                  SignatureDeclaringType-class sangfor.com.aop.activity.MainActivity
                                                                  SignatureName-testAOP
                                                                  SourceLocation-MainActivity.java:56
                                                                  SourceLocationFileName-MainActivity.java
                                                                  SourceLocationLine-56
                                                                  SourceLocationWithinType-class sangfor.com.aop.activity.MainActivity
                                                                  Target-sangfor.com.aop.activity.MainActivity@216343a8
                                                                  This-sangfor.com.aop.activity.MainActivity@216343a8
                                                                  Kind-method-call
04-21 03:16:20.616 6882-6882/sangfor.com.aop D/CheckExceAndCall: methodExecutionAOPTest: 
                                                                  Signature-void sangfor.com.aop.activity.MainActivity.testAOP()
                                                                  SignatureDeclaringTypeName-sangfor.com.aop.activity.MainActivity
                                                                  SignatureDeclaringType-class sangfor.com.aop.activity.MainActivity
                                                                  SignatureName-testAOP
                                                                  SourceLocation-MainActivity.java:61
                                                                  SourceLocationFileName-MainActivity.java
                                                                  SourceLocationLine-61
                                                                  SourceLocationWithinType-class sangfor.com.aop.activity.MainActivity
                                                                  Target-sangfor.com.aop.activity.MainActivity@216343a8
                                                                  This-sangfor.com.aop.activity.MainActivity@216343a8
                                                                  Kind-method-execution
04-21 03:16:20.616 6882-6882/sangfor.com.aop D/MainActivity: testAOP

hook基类,基类被锁定,子类是否也满足 切入点


我们目标为Activity的on方法,所有继承自Activity + 调用了super.的都触发了 切面程序

    public static final String TAG_ACTIVITYMENTHOD = "ActivityOnMethod";
    @Before("execution(* android.app.Activity.on**(..))")
    public void onActivityMethodBefore(JoinPoint joinPoint) throws Throwable {
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        String className = methodSignature.getDeclaringType().getSimpleName();
        String key = joinPoint.getSignature().toString();
        Log.d(TAG_ACTIVITYMENTHOD, "onActivityMethodBefore(): Signature---" + key
                + "  classname---" + className);
    }
04-21 03:16:19.526 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void sangfor.com.aop.activity.MainActivity.onCreate(Bundle)  classname---MainActivity
04-21 03:16:19.526 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void sangfor.com.aop.activity.BaseActivity.onCreate(Bundle)  classname---BaseActivity
04-21 03:16:19.526 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v7.app.AppCompatActivity.onCreate(Bundle)  classname---AppCompatActivity
04-21 03:16:19.546 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v4.app.FragmentActivity.onCreate(Bundle)  classname---FragmentActivity
04-21 03:16:19.546 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v4.app.BaseFragmentActivityGingerbread.onCreate(Bundle)  classname---BaseFragmentActivityGingerbread
04-21 03:16:19.556 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(View, String, Context, AttributeSet)  classname---BaseFragmentActivityHoneycomb
04-21 03:16:19.556 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityGingerbread.onCreateView(String, Context, AttributeSet)  classname---BaseFragmentActivityGingerbread
04-21 03:16:19.556 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(View, String, Context, AttributeSet)  classname---BaseFragmentActivityHoneycomb
04-21 03:16:19.556 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityGingerbread.onCreateView(String, Context, AttributeSet)  classname---BaseFragmentActivityGingerbread
04-21 03:16:19.556 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(View, String, Context, AttributeSet)  classname---BaseFragmentActivityHoneycomb
04-21 03:16:19.556 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityGingerbread.onCreateView(String, Context, AttributeSet)  classname---BaseFragmentActivityGingerbread
04-21 03:16:19.566 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(View, String, Context, AttributeSet)  classname---BaseFragmentActivityHoneycomb
04-21 03:16:19.566 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityGingerbread.onCreateView(String, Context, AttributeSet)  classname---BaseFragmentActivityGingerbread
04-21 03:16:19.566 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(View, String, Context, AttributeSet)  classname---BaseFragmentActivityHoneycomb
04-21 03:16:19.566 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityGingerbread.onCreateView(String, Context, AttributeSet)  classname---BaseFragmentActivityGingerbread
04-21 03:16:19.566 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(View, String, Context, AttributeSet)  classname---BaseFragmentActivityHoneycomb
04-21 03:16:19.566 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityGingerbread.onCreateView(String, Context, AttributeSet)  classname---BaseFragmentActivityGingerbread
04-21 03:16:19.576 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(View, String, Context, AttributeSet)  classname---BaseFragmentActivityHoneycomb
04-21 03:16:19.586 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityGingerbread.onCreateView(String, Context, AttributeSet)  classname---BaseFragmentActivityGingerbread
04-21 03:16:19.586 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(View, String, Context, AttributeSet)  classname---BaseFragmentActivityHoneycomb
04-21 03:16:19.586 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityGingerbread.onCreateView(String, Context, AttributeSet)  classname---BaseFragmentActivityGingerbread
04-21 03:16:19.606 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(View, String, Context, AttributeSet)  classname---BaseFragmentActivityHoneycomb
04-21 03:16:19.606 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityGingerbread.onCreateView(String, Context, AttributeSet)  classname---BaseFragmentActivityGingerbread
04-21 03:16:19.606 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v7.app.AppCompatActivity.onContentChanged()  classname---AppCompatActivity
04-21 03:16:20.866 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v7.app.AppCompatActivity.onStart()  classname---AppCompatActivity
04-21 03:16:20.866 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v4.app.FragmentActivity.onStart()  classname---FragmentActivity
04-21 03:16:20.866 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v7.app.AppCompatActivity.onPostCreate(Bundle)  classname---AppCompatActivity
04-21 03:16:20.866 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v7.app.AppCompatActivity.onTitleChanged(CharSequence, int)  classname---AppCompatActivity
04-21 03:16:20.866 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v4.app.FragmentActivity.onResume()  classname---FragmentActivity
04-21 03:16:20.866 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v7.app.AppCompatActivity.onPostResume()  classname---AppCompatActivity
04-21 03:16:20.866 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v4.app.FragmentActivity.onPostResume()  classname---FragmentActivity
04-21 03:16:20.936 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---boolean android.support.v4.app.FragmentActivity.onCreatePanelMenu(int, Menu)  classname---FragmentActivity
04-21 03:16:20.936 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---boolean android.support.v4.app.FragmentActivity.onPreparePanel(int, View, Menu)  classname---FragmentActivity

hook基类,重载函数的锁定,是否跟super有关:否

基类:
    @Override
    protected void overrideMethod() {
        //super.overrideMethod();
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
  子类:
      @Override
    protected void overrideMethod() {
        //super.overrideMethod();
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    /**
     * 测试场景:父类被锁定,子类是否也满足 切入点,与super有关
     * 答案:否
     * @param joinPoint
     * @throws Throwable
     */
    public static final String TAG_OverriderMENTHOD = "overrideMethod";
    @Before("execution(* sangfor.com.aop.activity.BaseActivity.overrideMethod(..))")
    public void onOverrideMethodefore(JoinPoint joinPoint) throws Throwable {
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        String className = methodSignature.getDeclaringType().getSimpleName();
        String key = joinPoint.getSignature().toString();
        Log.d(TAG_OverriderMENTHOD, "onOverrideMethodefore(): Signature---" + key
                + "  classname---" + className);
    }
  • 无super: 之所以不显示,是父类函数没执行而已,并不没hook
04-21 03:31:36.836 24724-24724/sangfor.com.aop D/overrideMethod: onOverrideMethodefore(): Signature---void sangfor.com.aop.activity.MainActivity.overrideMethod()  classname---MainActivity
  • 有super:
04-21 03:34:39.786 28617-28617/sangfor.com.aop D/overrideMethod: onOverrideMethodefore(): Signature---void sangfor.com.aop.activity.MainActivity.overrideMethod()  classname---MainActivity
04-21 03:34:39.786 28617-28617/sangfor.com.aop D/overrideMethod: onOverrideMethodefore(): Signature---void sangfor.com.aop.activity.BaseActivity.overrideMethod()  classname---BaseActivity

证明了:如果有super,父类的函数也会被视作切入点, 会先执行

基类:
    protected void overrideMethod() {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
子类:
       @Override
    protected void overrideMethod() {
        super.overrideMethod();
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    /**
     *  sangfor.com.aop.activity包下所有类的所有函数
     *  证明了:如果有super,父类的函数也会被视作切入点, 会先执行
     */
    @Around("execution(* sangfor.com.aop.activity..*.*(..))")
    public Object weaveAllJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        String className = methodSignature.getDeclaringType().getSimpleName();
        String methodName = methodSignature.getName();

        final TimeWatcher stopWatch = new TimeWatcher();
        stopWatch.start();
        Object result = joinPoint.proceed();
        stopWatch.stop();

        Log.d(TAG,
                "weaveAllJoinPoint():"
                        + " Signature = " + ((Signature)methodSignature).toString()+"\n"
                        + buildLogMessage(methodName, stopWatch.getTotalTimeMillis()));

        return 3;
    }
04-21 03:16:20.716 6882-6882/sangfor.com.aop D/MainActivity-AspectTest1: weaveAllJoinPoint(): Signature = void sangfor.com.aop.activity.BaseActivity.overrideMethod()
                                                                         Log --> overrideMethod --> [100ms]
04-21 03:16:20.766 6882-6882/sangfor.com.aop D/MainActivity-AspectTest1: weaveAllJoinPoint(): Signature = void sangfor.com.aop.activity.MainActivity.overrideMethod()
                                                                         Log --> overrideMethod --> [150ms]

如果切入点的函数有返回值,就不可以用void方式去around切入,否则编译失败

@Aspect
public class Aspect2 {

    public static final String TAG = "MainActivity-AspectTest2";

    /**
     *  sangfor.com.aop.activity包下所有类的所有函数
     *  证明了:如果切入点的函数有返回值,就不可以用void方式去around切入
     */
    @Around("execution(* sangfor.com.aop.activity.MainActivity.mapGUI(..))")
    public Object aspectmapGUI(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        String className = methodSignature.getDeclaringType().getSimpleName();
        String methodName = methodSignature.getName();

        final TimeWatcher stopWatch = new TimeWatcher();
        stopWatch.start();
        Object result = joinPoint.proceed();
        stopWatch.stop();

        Log.d(TAG,
                "weaveAllJoinPoint():"
                        + " Signature = " + ((Signature)methodSignature).toString()+"\n");

        return 3;
    }
}

public class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    protected void overrideMethod() {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    protected void overrideNoMethod() {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

日志

04-21 03:27:15.366 19455-19455/? I/art: Late-enabling -Xcheck:jni
04-21 03:27:15.496 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void sangfor.com.aop.activity.MainActivity.onCreate(Bundle)  classname---MainActivity
04-21 03:27:15.496 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void sangfor.com.aop.activity.BaseActivity.onCreate(Bundle)  classname---BaseActivity
04-21 03:27:15.496 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v7.app.AppCompatActivity.onCreate(Bundle)  classname---AppCompatActivity
04-21 03:27:15.516 19455-19455/sangfor.com.aop W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
04-21 03:27:15.526 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v4.app.FragmentActivity.onCreate(Bundle)  classname---FragmentActivity
04-21 03:27:15.526 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v4.app.BaseFragmentActivityGingerbread.onCreate(Bundle)  classname---BaseFragmentActivityGingerbread
04-21 03:27:15.526 19455-19455/sangfor.com.aop D/MainActivity-AspectTest1: weaveAllJoinPoint(): Signature = void sangfor.com.aop.activity.BaseActivity.onCreate(Bundle)
                                                                           Log --> onCreate --> [25ms]
04-21 03:27:15.526 19455-19455/sangfor.com.aop E/Process: android_os_Process_getProcessNameByPid pid is 19455
04-21 03:27:15.526 19455-19455/sangfor.com.aop E/Process: android_os_Process_getProcessNameByPid value is sangfor.com.aop
04-21 03:27:15.536 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(View, String, Context, AttributeSet)  classname---BaseFragmentActivityHoneycomb
04-21 03:27:15.536 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityGingerbread.onCreateView(String, Context, AttributeSet)  classname---BaseFragmentActivityGingerbread
04-21 03:27:15.536 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(View, String, Context, AttributeSet)  classname---BaseFragmentActivityHoneycomb
04-21 03:27:15.536 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityGingerbread.onCreateView(String, Context, AttributeSet)  classname---BaseFragmentActivityGingerbread
04-21 03:27:15.536 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(View, String, Context, AttributeSet)  classname---BaseFragmentActivityHoneycomb
04-21 03:27:15.536 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityGingerbread.onCreateView(String, Context, AttributeSet)  classname---BaseFragmentActivityGingerbread
04-21 03:27:15.546 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(View, String, Context, AttributeSet)  classname---BaseFragmentActivityHoneycomb
04-21 03:27:15.546 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityGingerbread.onCreateView(String, Context, AttributeSet)  classname---BaseFragmentActivityGingerbread
04-21 03:27:15.546 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(View, String, Context, AttributeSet)  classname---BaseFragmentActivityHoneycomb
04-21 03:27:15.546 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityGingerbread.onCreateView(String, Context, AttributeSet)  classname---BaseFragmentActivityGingerbread
04-21 03:27:15.546 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(View, String, Context, AttributeSet)  classname---BaseFragmentActivityHoneycomb
04-21 03:27:15.546 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityGingerbread.onCreateView(String, Context, AttributeSet)  classname---BaseFragmentActivityGingerbread
04-21 03:27:15.566 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(View, String, Context, AttributeSet)  classname---BaseFragmentActivityHoneycomb
04-21 03:27:15.566 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityGingerbread.onCreateView(String, Context, AttributeSet)  classname---BaseFragmentActivityGingerbread
04-21 03:27:15.566 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(View, String, Context, AttributeSet)  classname---BaseFragmentActivityHoneycomb
04-21 03:27:15.576 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityGingerbread.onCreateView(String, Context, AttributeSet)  classname---BaseFragmentActivityGingerbread
04-21 03:27:15.586 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(View, String, Context, AttributeSet)  classname---BaseFragmentActivityHoneycomb
04-21 03:27:15.586 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---View android.support.v4.app.BaseFragmentActivityGingerbread.onCreateView(String, Context, AttributeSet)  classname---BaseFragmentActivityGingerbread
04-21 03:27:15.596 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v7.app.AppCompatActivity.onContentChanged()  classname---AppCompatActivity
04-21 03:27:16.596 19455-19455/sangfor.com.aop D/CheckExceAndCall: methodExecutionAOPTest: 
                                                                    Signature-void sangfor.com.aop.activity.MainActivity.testAOP()
                                                                    SignatureDeclaringTypeName-sangfor.com.aop.activity.MainActivity
                                                                    SignatureDeclaringType-class sangfor.com.aop.activity.MainActivity
                                                                    SignatureName-testAOP
                                                                    SourceLocation-MainActivity.java:56
                                                                    SourceLocationFileName-MainActivity.java
                                                                    SourceLocationLine-56
                                                                    SourceLocationWithinType-class sangfor.com.aop.activity.MainActivity
                                                                    Target-sangfor.com.aop.activity.MainActivity@216343a8
                                                                    This-sangfor.com.aop.activity.MainActivity@216343a8
                                                                    Kind-method-call
04-21 03:27:16.596 19455-19455/sangfor.com.aop D/CheckExceAndCall: methodExecutionAOPTest: 
                                                                    Signature-void sangfor.com.aop.activity.MainActivity.testAOP()
                                                                    SignatureDeclaringTypeName-sangfor.com.aop.activity.MainActivity
                                                                    SignatureDeclaringType-class sangfor.com.aop.activity.MainActivity
                                                                    SignatureName-testAOP
                                                                    SourceLocation-MainActivity.java:61
                                                                    SourceLocationFileName-MainActivity.java
                                                                    SourceLocationLine-61
                                                                    SourceLocationWithinType-class sangfor.com.aop.activity.MainActivity
                                                                    Target-sangfor.com.aop.activity.MainActivity@216343a8
                                                                    This-sangfor.com.aop.activity.MainActivity@216343a8
                                                                    Kind-method-execution
04-21 03:27:16.596 19455-19455/sangfor.com.aop D/MainActivity: testAOP
04-21 03:27:16.596 19455-19455/sangfor.com.aop D/MainActivity-AspectTest1: weaveAllJoinPoint(): Signature = void sangfor.com.aop.activity.MainActivity.testAOP()
                                                                           Log --> testAOP --> [0ms]
04-21 03:27:16.596 19455-19455/sangfor.com.aop D/MainActivity-AspectTest2: weaveAllJoinPoint(): Signature = int sangfor.com.aop.activity.MainActivity.mapGUI()
04-21 03:27:16.596 19455-19455/sangfor.com.aop D/MainActivity-AspectTest1: weaveAllJoinPoint(): Signature = int sangfor.com.aop.activity.MainActivity.mapGUI()
                                                                           Log --> mapGUI --> [1001ms]
04-21 03:27:16.596 19455-19455/sangfor.com.aop D/MainActivity: 被AOP修改后的值为3
04-21 03:27:16.596 19455-19455/sangfor.com.aop D/MainActivity-AspectTest1: weaveAllJoinPoint(): Signature = void sangfor.com.aop.activity.MainActivity.checkPhoneState()
                                                                           Log --> checkPhoneState --> [0ms]
04-21 03:27:16.596 19455-19455/sangfor.com.aop D/MainActivity: methodBeforecheckInput: void sangfor.com.aop.activity.MainActivity.checkInput(int, StringBuilder)
04-21 03:27:16.596 19455-19455/sangfor.com.aop D/CheckInput: methodBeforecheckInput():1
04-21 03:27:16.596 19455-19455/sangfor.com.aop D/CheckInput: methodBeforecheckInput():a
04-21 03:27:16.596 19455-19455/sangfor.com.aop D/MainActivity-AspectTest1: weaveAllJoinPoint(): Signature = void sangfor.com.aop.activity.MainActivity.checkInput(int, StringBuilder)
                                                                           Log --> checkInput --> [0ms]
04-21 03:27:16.596 19455-19455/sangfor.com.aop D/CheckInput: methodAftercheckInput():1
04-21 03:27:16.596 19455-19455/sangfor.com.aop D/CheckInput: methodAftercheckInput():ab
04-21 03:27:16.696 19455-19455/sangfor.com.aop D/MainActivity-AspectTest1: weaveAllJoinPoint(): Signature = void sangfor.com.aop.activity.BaseActivity.overrideMethod()
                                                                           Log --> overrideMethod --> [100ms]
04-21 03:27:16.746 19455-19455/sangfor.com.aop D/MainActivity-AspectTest1: weaveAllJoinPoint(): Signature = void sangfor.com.aop.activity.MainActivity.overrideMethod()
                                                                           Log --> overrideMethod --> [150ms]
04-21 03:27:16.846 19455-19455/sangfor.com.aop D/MainActivity-AspectTest1: weaveAllJoinPoint(): Signature = void sangfor.com.aop.activity.BaseActivity.overrideNoMethod()
                                                                           Log --> overrideNoMethod --> [100ms]
04-21 03:27:16.846 19455-19455/sangfor.com.aop D/MainActivity-AspectTest1: weaveAllJoinPoint(): Signature = void sangfor.com.aop.activity.MainActivity.onCreate(Bundle)
                                                                           Log --> onCreate --> [1347ms]
04-21 03:27:16.846 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v7.app.AppCompatActivity.onStart()  classname---AppCompatActivity
04-21 03:27:16.846 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v4.app.FragmentActivity.onStart()  classname---FragmentActivity
04-21 03:27:16.846 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v7.app.AppCompatActivity.onPostCreate(Bundle)  classname---AppCompatActivity
04-21 03:27:16.846 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v7.app.AppCompatActivity.onTitleChanged(CharSequence, int)  classname---AppCompatActivity
04-21 03:27:16.846 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v4.app.FragmentActivity.onResume()  classname---FragmentActivity
04-21 03:27:16.846 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v7.app.AppCompatActivity.onPostResume()  classname---AppCompatActivity
04-21 03:27:16.846 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v4.app.FragmentActivity.onPostResume()  classname---FragmentActivity
04-21 03:27:16.856 19455-19512/sangfor.com.aop D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
04-21 03:27:16.856 19455-19455/sangfor.com.aop D/Atlas: Validating map...
04-21 03:27:16.886 19455-19512/sangfor.com.aop I/Adreno-EGL: <qeglDrvAPI_eglInitialize:379>: EGL 1.4 QUALCOMM build:  (I9d3821c5ab)
                                                             OpenGL ES Shader Compiler Version: E031.25.03.04
                                                             Build Date: 09/23/15 Wed
                                                             Local Branch: 
                                                             Remote Branch: 
                                                             Local Patches: 
                                                             Reconstruct Branch: 
04-21 03:27:16.886 19455-19512/sangfor.com.aop I/OpenGLRenderer: Initialized EGL, version 1.4
04-21 03:27:16.896 19455-19512/sangfor.com.aop D/OpenGLRenderer: Enabling debug mode 0
04-21 03:27:16.916 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---boolean android.support.v4.app.FragmentActivity.onCreatePanelMenu(int, Menu)  classname---FragmentActivity
04-21 03:27:16.916 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---boolean android.support.v4.app.FragmentActivity.onPreparePanel(int, View, Menu)  classname---FragmentActivity

MainActivity 全部

package sangfor.com.aop.activity;

import android.os.Bundle;
import android.util.Log;

import sangfor.com.aop.R;
import sangfor.com.aop.annotation.DebugTrace;
import sangfor.com.aop.annotation.SecurityCheckAnnotation;

public class MainActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        int s = mapGUI();
        Log.d("MainActivity", "被AOP修改后的值为" + s);
        checkPhoneState();

        int i = 1;
        StringBuilder stringBuilder = new StringBuilder("a");
        checkInput(i, stringBuilder);


        overrideMethod();
        overrideNoMethod();
    }

    @Override
    protected void overrideMethod() {
        super.overrideMethod();
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private void checkInput(int i,StringBuilder stringBuilder ) {
        i=2;
        stringBuilder.append("b");
    }

    /**
     * Maps Graphical User Interface
     */
    @DebugTrace
    private int mapGUI() {

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        testAOP();
        return 1;
    }

    public void testAOP() {
        Log.d("MainActivity", "testAOP");
    }

    //为checkPhoneState使用SecurityCheckAnnotation注解,并指明调用该函数的人需要声明的权限
    @SecurityCheckAnnotation(declaredPermission="android.permission.READ_PHONE_STATE")
    public void checkPhoneState(){
        //如果不使用AOP,就得自己来检查权限
    /*if(checkPermission("android.permission.READ_PHONE_STATE") ==false){
      Log.e("MainActivity","have no permission to read phone state");
      return;
    }
    Log.e("MainActivity","Read Phone State succeed");
    return;*/
    }
}

工具–切面环境实体类

public class TimeAspectData {

    /* 示例
     * @Before("execution(* sangfor.com.aop.activity.MainActivity.testAOP(..))")
     * Signature-void sangfor.com.aop.activity.MainActivity.testAOP()
     *  - SignatureDeclaringTypeName-sangfor.com.aop.activity.MainActivity
     *  - SignatureDeclaringType-class sangfor.com.aop.activity.MainActivity
     *  - SignatureName-testAOP
     * SourceLocation-MainActivity.java:61
     *  - SourceLocationFileName-MainActivity.java
     *  - SourceLocationLine-61
     *  - SourceLocationWithinType-class sangfor.com.aop.activity.MainActivity
     * Target-sangfor.com.aop.activity.MainActivity@3fdcfead
     * This-sangfor.com.aop.activity.MainActivity@3fdcfead
     * Kind-method-execution
     */
    private String aspectClassTag;
    private String aspectMethod;

    private JoinPoint joinPoint;
    private Signature aspectSignature;//连接点的方法签名对象,其toString函数类似: [void sangfor.com.aop.activity.MainActivity.testAOP()]
    private String aspectKind;//连接点的切面类型
    private SourceLocation aspectSourceLocation; //切入点位置
    private Object aspectTarget;//连接点所在的目标对象实例
    private Object aspectThis;//代理对象本身实例
    private Object aspectArgs[];//连接点方法运行时的入参列表,使用Arrays.toString(object)打印
    private String aspectArgsStr; //自定义的 参数打印列表

    private long startTime;//函数调用时间
    private long endTime;//函数结束时间
    private long elapsedTime;//函数执行耗时


    public TimeAspectData(String aspectClassTag, String aspectMethod, JoinPoint joinPoint){
        this(aspectClassTag, aspectMethod, joinPoint, 0, 0, 0, null);
    }

    public TimeAspectData(String aspectClassTag, String aspectMethod, JoinPoint joinPoint, TimeWatcher timeWatcher){
        this(aspectClassTag, aspectMethod, joinPoint, timeWatcher.getStartTime(), timeWatcher.getEndTime(), timeWatcher.getTotalTimeMillis(), null);
    }

    public TimeAspectData(String aspectClassTag, String aspectMethod, JoinPoint joinPoint, TimeWatcher timeWatcher, String aspectArgsStr){
        this(aspectClassTag, aspectMethod, joinPoint, timeWatcher.getStartTime(), timeWatcher.getEndTime(), timeWatcher.getTotalTimeMillis(), aspectArgsStr);
    }

    public TimeAspectData(String aspectClassTag, String aspectMethod, JoinPoint joinPoint, long startTime, long endTime, long elapsedTime, String aspectArgsStr){
        this.aspectClassTag = aspectClassTag;
        this.aspectMethod = aspectMethod;

        this.joinPoint = joinPoint;
        this.aspectSignature = joinPoint.getSignature();
        this.aspectKind = joinPoint.getKind();
        this.aspectArgs = joinPoint.getArgs();
        this.aspectArgsStr = (aspectArgsStr == null ? Arrays.toString(aspectArgs) : aspectArgsStr);
        this.aspectSourceLocation = joinPoint.getSourceLocation();
        this.aspectTarget = joinPoint.getTarget();
        this.aspectThis = joinPoint.getThis();

        this.startTime = startTime;
        this.endTime = endTime;
        this.elapsedTime = elapsedTime;
    }


    @Override
    public String toString() {
        return  aspectClassTag + aspectMethod
                + "\nSignature = " + aspectSignature.toString()
                + "\nKind = " + aspectKind
                + "\nArgs = " + aspectArgsStr
                + "\nSourceLocation =" + aspectSourceLocation
                + "\nTarget = " + aspectTarget
                + "\nThis = " + aspectThis
                + "\n时间 = " + elapsedTime;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值