项目作者: zfl5232577

项目描述 :
基于aspectj的AOP
高级语言: Java
项目地址: git://github.com/zfl5232577/MarkAop.git
创建时间: 2018-05-30T10:05:56Z
项目社区:https://github.com/zfl5232577/MarkAop

开源协议:

下载


MarkAop

面向切面编程-使代码更加清晰————工具使用aspectj

基于aspectj的AOP,无需使用耗费性能的反射.不过,需要在build.gradle中配置一下aspectj
已经是适配完成AndroidX,使用2.0.0+版本是适配AndroidX,1.0.0+为普通版本。

AOP切面框架:

  1. buildscript {
  2. repositories {
  3. maven { url "https://raw.githubusercontent.com/zfl5232577/maven/master" }
  4. }
  5. dependencies {
  6. classpath 'com.mark:markaop-plugin:1.3.3'
  7. }
  8. }
  9. allprojects {
  10. repositories {
  11. maven { url "https://raw.githubusercontent.com/zfl5232577/maven/master" }
  12. }
  13. }

Module的build.gradle文件

  1. apply plugin: 'markaop-plugin'

混淆规则:

  1. -keep class com.mark.** { *; }
  2. -dontwarn com.mark.**
  3. -keepclassmembers class ** {
  4. @com.mark.aoplibrary.annotation.* <methods>;
  5. }

框架初始化:


  1. MarkAOPHelper.getInstance().init(context);//初始化
  2. MarkAOPHelper.getInstance().getOptions().setDebug(BuildConfig.DEBUG);//日志打印Logger和Timelog的开关
  3. MarkAOPHelper.getInstance().getOptions().setLoginActivity(LoginActivity.class
  4. ,LoginActivity.REQUEST_CODE);//设置登陆界面和跳转登陆界面的申请码

登陆成功后一定记得调用:

  1. SPUtils.getInstance().put("isLogin",true);

检查登陆和检查权限配置需要麻烦点,因为登陆会完成你登陆前的操作,检查权限会自己去申请权限或者弹出提示框。

配置如下:

BaseActivity添加下面函数和变量:

  1. public class BaseActivity extends AppCompatActivity {
  2. //配置检查登陆,登陆成功返回后自动执行原始函数,
  3. @Override
  4. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  5. super.onActivityResult(requestCode, resultCode, data);
  6. if (resultCode != RESULT_OK) {
  7. return;
  8. }
  9. switch (requestCode) {
  10. case LoginActivity.REQUEST_CODE:
  11. List<Method> mMethodList = MarkAOPHelper.getInstance().getMethodList();
  12. HashMap<String, Object[]> mMethodArgs = MarkAOPHelper.getInstance().getMethodArgs();
  13. HashMap<String, Object> mTargets = MarkAOPHelper.getInstance().getTargets();
  14. for (Method method : mMethodList) {
  15. try {
  16. method.setAccessible(true);
  17. Object[] args = mMethodArgs.get(method.getName());
  18. Object target = mTargets.get(method.getName());
  19. if (target != null) {
  20. if (args != null) {
  21. method.invoke(target, args);
  22. } else {
  23. method.invoke(target);
  24. }
  25. }
  26. } catch (IllegalAccessException e) {
  27. e.printStackTrace();
  28. } catch (InvocationTargetException e) {
  29. e.printStackTrace();
  30. }
  31. }
  32. MarkAOPHelper.getInstance().clear();
  33. break;
  34. }
  35. }
  36. //配置权限检查需要添加的方法
  37. @Override
  38. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  39. super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  40. MPermissionUtils.onRequestPermissionsResult(requestCode, permissions, grantResults);
  41. }
  42. }
注解名称 作用 备注
@Async 借助rxjava,异步执行app中的方法 尽量使用在静态方法上,否则很容易内存泄漏,线程会持有Activity的引用
@CheckLogin 检查是否登陆,设置了登陆界面直接登陆界面,登陆完成后自己执行上此操作
@Logger 将方法的入参和出参都打印出来,可以用于调试
@CheckNet 可以在调用某个方法之前,检查网络连接状况,没有连接,注解不带方法名参数则不操作并弹出Toast,假如有方法名参数则执行该方法
@CheckPermission 适配6.0动态权限,没有权限并且申请权限
@SingleClick 防止按钮被连点,执行重复操作,点击间隔为600ms 支持追踪匿名内部类中的方法
@TimeLog 用于追踪某个方法花费的时间,可以用于性能调优的评判 支持追踪匿名内部类中的方法
@NotOpen 用于拦截某个方法,功能暂未完成,弹出Toast提示