当前位置:   article > 正文

AOP之ASpectj最详细使用_org.aspectj

org.aspectj

AOP面向切面编程,通过预编译方式和运行期动态代理实现程序的统一维护的一种技术。

Aspectj框架就是通过预编译方式实现程序的统一维护,今天介绍如何使用:

//配置版本信息分两步,使用分三步

最新版本的aspectj是1.9.4但是需要SDK最低版本24,这里我就是使用1.8.9版本

//配置信息

1:在工程的build.gradle添加下面依赖

  1. buildscript {
  2. repositories {
  3. google()
  4. //镜像仓,解决需要翻墙下载的
  5. maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
  6. jcenter()
  7. }
  8. dependencies {
  9. classpath 'com.android.tools.build:gradle:3.2.0'
  10. //aspectj框架
  11. classpath 'org.aspectj:aspectjtools:1.8.9'
  12. classpath 'org.aspectj:aspectjweaver:1.8.9'
  13. // NOTE: Do not place your application dependencies here; they belong
  14. // in the individual module build.gradle files
  15. }
  16. }
  17. allprojects {
  18. repositories {
  19. google()
  20. //镜像仓,解决需要翻墙下载的
  21. maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
  22. jcenter()
  23. }
  24. }

2:在module的build.gradle添加下面依赖

  1. apply plugin: 'com.android.application'
  2. android {
  3. compileSdkVersion 29
  4. buildToolsVersion "30.0.0"
  5. defaultConfig {
  6. applicationId "com.example.myaspectj"
  7. minSdkVersion 16
  8. targetSdkVersion 29
  9. versionCode 1
  10. versionName "1.0"
  11. testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
  12. }
  13. buildTypes {
  14. release {
  15. minifyEnabled false
  16. proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  17. }
  18. }
  19. }
  20. dependencies {
  21. implementation fileTree(dir: "libs", include: ["*.jar"])
  22. implementation 'androidx.appcompat:appcompat:1.2.0'
  23. implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
  24. testImplementation 'junit:junit:4.12'
  25. androidTestImplementation 'androidx.test.ext:junit:1.1.2'
  26. androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
  27. //使用aspectj框架
  28. implementation 'org.aspectj:aspectjrt:1.8.9'
  29. }
  30. //aspectj配置打印log
  31. import org.aspectj.bridge.IMessage
  32. import org.aspectj.bridge.MessageHandler
  33. import org.aspectj.tools.ajc.Main
  34. final def log = project.logger
  35. final def variants = project.android.applicationVariants
  36. variants.all { variant ->
  37. if (!variant.buildType.isDebuggable()) {
  38. log.debug("Skipping non-debuggable build type '${variant.buildType.name}'.")
  39. return
  40. }
  41. //如果JavaCompile报红能编译过不影响使用
  42. JavaCompile javaCompile = variant.javaCompile
  43. javaCompile.doLast {
  44. String[] args = ["-showWeaveInfo",
  45. "-1.8",//注意版本保存一致
  46. "-inpath", javaCompile.destinationDir.toString(),
  47. "-aspectpath", javaCompile.classpath.asPath,
  48. "-d", javaCompile.destinationDir.toString(),
  49. "-classpath", javaCompile.classpath.asPath,
  50. "-bootclasspath", project.android.bootClasspath.join(File.pathSeparator)]
  51. log.debug "ajc args: " + Arrays.toString(args)
  52. MessageHandler handler = new MessageHandler(true)
  53. new Main().run(args, handler)
  54. for (IMessage message : handler.getMessages(null, true)) {
  55. switch (message.getKind()) {
  56. case IMessage.ABORT:
  57. case IMessage.ERROR:
  58. case IMessage.FAIL:
  59. log.error message.message, message.thrown
  60. break
  61. case IMessage.WARNING:
  62. log.warn message.message, message.thrown
  63. break
  64. case IMessage.INFO:
  65. log.info message.message, message.thrown
  66. break
  67. case IMessage.DEBUG:
  68. log.debug message.message, message.thrown
  69. break
  70. }
  71. }
  72. }
  73. }

使用三部曲

1>自定义注解:根据你的需要设置注解的目标,和作用域

  1. @Target(ElementType.METHOD)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. public @interface LoginTrace {
  4. String value() default "";
  5. }

2>创建个切面处理类,处理所有使用注解的逻辑,统一在这个类处理

  1. //切面
  2. @Aspect
  3. public class LoginAapect {
  4. //切入点 ("execution(@注解全类名 * *(..)")
  5. @Pointcut("execution(@com.example.administrator.aop_aspectj.annotation.LoginTrace * *(..))")
  6. public void methodAnnotationWithLoginTrace() {
  7. }
  8. //切入点逻辑处理(可以对 切入点 前处理 后处理 前后处理 )
  9. //参数--->切入点方法名()--->methodAnnotationWithLoginTrace()
  10. // @After("methodAnnotationWithLoginTrace()")//切入点后运行 --》使用注解LoginTrace的方法运行完后执行这个方法代码(可以不返回对象)
  11. // @Before("methodAnnotationWithLoginTrace()")//切入点前运行(可以不返回对象)
  12. @Around("methodAnnotationWithLoginTrace()")//切入点前 后 都运行(后运行是在ProceedingJoinPoint对象非空时运行) (必须返回object对象)
  13. public Object weaveJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {
  14. Log.e("zdh", "-------------前");
  15. //如果想要获取自定义注解属性值 必须使用@Around 通过ProceedingJoninPoint获取
  16.   //例如
  17.   LoginTrace loginTrace=((MethodSignarure)joinPoint.getSignature()).getMethod().getAnnotation(LoginTrace.class);//获取自定义注解对象
  18.   String value=loginTrace.value();//注解属性值
  19.  
  20. Object proceed=null;
  21. if (joinPoint != null) { //如果使用Around注解需要返回proceed对象,要不然注解方法里面代码不执行
  22. proceed = joinPoint.proceed();
  23. Log.e("zdh", "-------------后");
  24. }
  25. return proceed;
  26. }
  27. }

//在需要统一处理的方法添加注解

  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. }
  1. //如果你想区分不同方法可以使用标记区分--》@LoginTrace("send")
  2. @LoginTrace
  3. public void send(View view) {
  4. Log.e("zdh","------------测试");
  5. }
  6. }

//运行代码就可以看到打印日志如下

注意混淆 在项目的build.build里面配置 扫描指定文件,防止扫描其他文件导致错误

aspectjx {
    //指定只对含有关键字'universal-image-loader', 'AspectJX-Demo/library'的库进行织入扫描,忽略其他库,提升编译效率
//    includeJarFilter 'universal-image-loader', 'AspectJX-Demo/library'
        include 'com.gemini'
        exclude 'com.amitshekhar'
        exclude 'com.mobile'
        exclude 'com.nirvana'
        exclude 'com.cmic'
        exclude 'com.unicom'
//    excludeJarFilter '.jar'
//    ajcArgs '-Xlint:warning'
}

 

 

 

 是不是很简单。

总结:1:在依赖时需要注意1.9前和1.9的SDK最低版本问题,

           2:在依赖导报可以添加镜像仓看看。

           3:如果使用Around注解需要返回proceed对象,要不然注解方法里面代码不执行

           4:使用注解的方法一般是不会影响方法里面代码执行的,所以要考虑方法里面代码执行后的效果,

 

//下面以实际项目需要写个demo,一般在开发中我们有些页面是需要用户登录后才能进入的,这里面就以登录为实例写个demo

源码地址https://github.com/zhudaihao/AOP_aspectj

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/266734
推荐阅读
  

闽ICP备14008679号