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

来源:互联网 发布:mac 配置hadoop 编辑:程序博客网 时间:2024/06/03 17:30

  • JoinPoint获取的参数是值or引用
  • execution 与 call的不同
  • hook基类基类被锁定子类是否也满足 切入点
  • hook基类重载函数的锁定是否跟super有关否
  • 证明了如果有super父类的函数也会被视作切入点 会先执行
  • 如果切入点的函数有返回值就不可以用void方式去around切入否则编译失败
  • 日志
  • MainActivity 全部
  • 工具切面环境实体类

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():104-21 03:12:48.896 2692-2692/sangfor.com.aop D/CheckInput: methodBeforecheckInput():a04-21 03:12:48.896 2692-2692/sangfor.com.aop D/CheckInput: methodAftercheckInput():104-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-call04-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-execution04-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---MainActivity04-21 03:16:19.526 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void sangfor.com.aop.activity.BaseActivity.onCreate(Bundle)  classname---BaseActivity04-21 03:16:19.526 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v7.app.AppCompatActivity.onCreate(Bundle)  classname---AppCompatActivity04-21 03:16:19.546 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v4.app.FragmentActivity.onCreate(Bundle)  classname---FragmentActivity04-21 03:16:19.546 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v4.app.BaseFragmentActivityGingerbread.onCreate(Bundle)  classname---BaseFragmentActivityGingerbread04-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---BaseFragmentActivityHoneycomb04-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---BaseFragmentActivityGingerbread04-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---BaseFragmentActivityHoneycomb04-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---BaseFragmentActivityGingerbread04-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---BaseFragmentActivityHoneycomb04-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---BaseFragmentActivityGingerbread04-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---BaseFragmentActivityHoneycomb04-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---BaseFragmentActivityGingerbread04-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---BaseFragmentActivityHoneycomb04-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---BaseFragmentActivityGingerbread04-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---BaseFragmentActivityHoneycomb04-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---BaseFragmentActivityGingerbread04-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---BaseFragmentActivityHoneycomb04-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---BaseFragmentActivityGingerbread04-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---BaseFragmentActivityHoneycomb04-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---BaseFragmentActivityGingerbread04-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---BaseFragmentActivityHoneycomb04-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---BaseFragmentActivityGingerbread04-21 03:16:19.606 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v7.app.AppCompatActivity.onContentChanged()  classname---AppCompatActivity04-21 03:16:20.866 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v7.app.AppCompatActivity.onStart()  classname---AppCompatActivity04-21 03:16:20.866 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v4.app.FragmentActivity.onStart()  classname---FragmentActivity04-21 03:16:20.866 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v7.app.AppCompatActivity.onPostCreate(Bundle)  classname---AppCompatActivity04-21 03:16:20.866 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v7.app.AppCompatActivity.onTitleChanged(CharSequence, int)  classname---AppCompatActivity04-21 03:16:20.866 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v4.app.FragmentActivity.onResume()  classname---FragmentActivity04-21 03:16:20.866 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v7.app.AppCompatActivity.onPostResume()  classname---AppCompatActivity04-21 03:16:20.866 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v4.app.FragmentActivity.onPostResume()  classname---FragmentActivity04-21 03:16:20.936 6882-6882/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---boolean android.support.v4.app.FragmentActivity.onCreatePanelMenu(int, Menu)  classname---FragmentActivity04-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---MainActivity04-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切入,否则编译失败

@Aspectpublic 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:jni04-21 03:27:15.496 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void sangfor.com.aop.activity.MainActivity.onCreate(Bundle)  classname---MainActivity04-21 03:27:15.496 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void sangfor.com.aop.activity.BaseActivity.onCreate(Bundle)  classname---BaseActivity04-21 03:27:15.496 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v7.app.AppCompatActivity.onCreate(Bundle)  classname---AppCompatActivity04-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.Drawable04-21 03:27:15.526 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v4.app.FragmentActivity.onCreate(Bundle)  classname---FragmentActivity04-21 03:27:15.526 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v4.app.BaseFragmentActivityGingerbread.onCreate(Bundle)  classname---BaseFragmentActivityGingerbread04-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 1945504-21 03:27:15.526 19455-19455/sangfor.com.aop E/Process: android_os_Process_getProcessNameByPid value is sangfor.com.aop04-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---BaseFragmentActivityHoneycomb04-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---BaseFragmentActivityGingerbread04-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---BaseFragmentActivityHoneycomb04-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---BaseFragmentActivityGingerbread04-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---BaseFragmentActivityHoneycomb04-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---BaseFragmentActivityGingerbread04-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---BaseFragmentActivityHoneycomb04-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---BaseFragmentActivityGingerbread04-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---BaseFragmentActivityHoneycomb04-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---BaseFragmentActivityGingerbread04-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---BaseFragmentActivityHoneycomb04-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---BaseFragmentActivityGingerbread04-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---BaseFragmentActivityHoneycomb04-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---BaseFragmentActivityGingerbread04-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---BaseFragmentActivityHoneycomb04-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---BaseFragmentActivityGingerbread04-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---BaseFragmentActivityHoneycomb04-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---BaseFragmentActivityGingerbread04-21 03:27:15.596 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v7.app.AppCompatActivity.onContentChanged()  classname---AppCompatActivity04-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-call04-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-execution04-21 03:27:16.596 19455-19455/sangfor.com.aop D/MainActivity: testAOP04-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修改后的值为304-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():104-21 03:27:16.596 19455-19455/sangfor.com.aop D/CheckInput: methodBeforecheckInput():a04-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():104-21 03:27:16.596 19455-19455/sangfor.com.aop D/CheckInput: methodAftercheckInput():ab04-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---AppCompatActivity04-21 03:27:16.846 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v4.app.FragmentActivity.onStart()  classname---FragmentActivity04-21 03:27:16.846 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v7.app.AppCompatActivity.onPostCreate(Bundle)  classname---AppCompatActivity04-21 03:27:16.846 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v7.app.AppCompatActivity.onTitleChanged(CharSequence, int)  classname---AppCompatActivity04-21 03:27:16.846 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v4.app.FragmentActivity.onResume()  classname---FragmentActivity04-21 03:27:16.846 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v7.app.AppCompatActivity.onPostResume()  classname---AppCompatActivity04-21 03:27:16.846 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---void android.support.v4.app.FragmentActivity.onPostResume()  classname---FragmentActivity04-21 03:27:16.856 19455-19512/sangfor.com.aop D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true04-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.404-21 03:27:16.896 19455-19512/sangfor.com.aop D/OpenGLRenderer: Enabling debug mode 004-21 03:27:16.916 19455-19455/sangfor.com.aop D/ActivityOnMethod: onActivityMethodBefore(): Signature---boolean android.support.v4.app.FragmentActivity.onCreatePanelMenu(int, Menu)  classname---FragmentActivity04-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 0