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;
}
}