(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
- (4.6.23.3)Android之面向切面编程:Aspect示例之继承关系测试
- (4.6.23.2)Android之面向切面编程:Aspect集成示例之DebugTrace 与 SecurityCheckAnnotation
- (4.6.23.1)Android之面向切面编程:AOP 与 Aspect简介
- aspect 面向切面编程
- 面向切面编程(AOP:Aspect Orient Programming)1
- 面向切面编程(AOP:Aspect Orient Programming)2
- spring面向切面编程AOP(Aspect-orented programming)
- AOP(面向切面编程 Aspect Oriented Programming)
- Spring aop(Aspect Oriented Programming:面向切面编程)入门
- Java 面向切面编程(Aspect Oriented Programming,AOP)
- Spring之AOP(面向切面编程)
- Spring之AOP(面向切面编程)
- Spring之配置切面aspect
- AOP面向切面编程(Aspect Oriented Programming)
- 面向切面编程 Aspect Oriented Programming
- AOP( aspect-oriented programming)面向切面编程
- Aspect-Oriented Programming 面向切面编程
- AOP(Aspect Oriented Programming),面向切面编程
- aliyun搭建环境
- SourceInsight 使用技巧
- 查看修改MySQL字符集以及乱码解决
- Java web开发总结(五):如何进行系统优化的思考
- SELECT语法
- (4.6.23.3)Android之面向切面编程:Aspect示例之继承关系测试
- java 控制spark
- kali更新源
- HDU
- (2)caffe总结之目录结构
- 前端之bug收集
- scala 写spark
- oracle 给逗号分割的数据添加引号
- 对象数组如何set值并加到对象里面