【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行原理分析

举报
韩曙亮 发表于 2022/01/13 00:04:09 2022/01/13
【摘要】 文章目录 一、查看使用 AspectJ 后生成的 Class 字节码类二、AspectJ 的本质 一、查看使用 AspectJ 后生成的 Class 字节码类 在 ...





一、查看使用 AspectJ 后生成的 Class 字节码类



在 Android Studio 中查找编译的 MainActivity 字节码文件 , 最终在 Y:\002_WorkSpace\001_AS\AOP_Demo\app\build\intermediates\javac\debug\classes\com\example\aop_demo 目录下找到 MainActivity.class 文件 ;

在这里插入图片描述

字节码文件内容 :

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package com.example.aop_demo;

import android.os.Bundle;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.runtime.reflect.Factory;

public class MainActivity extends AppCompatActivity {
    public MainActivity() {
    }

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(2131427356);
    }

    @Monitor("textClick")
    public void textClick(View view) {
        JoinPoint var3 = Factory.makeJP(ajc$tjp_0, this, this, view);
        textClick_aroundBody1$advice(this, view, var3, MonitorAspect.aspectOf(), (ProceedingJoinPoint)var3);
    }

    static {
        ajc$preClinit();
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33




二、AspectJ 的本质



Java 源码 通过 javac 编译器 编译后得到 Class 字节码文件 ;

AspectJ 也是一个编译器 , AspectJ 编译 Java 代码时 , 加入了 AOP 相关代码 ;

在 Gradle 配置中 , 也配置了 Java 编译器相关配置项 ;

    JavaCompile javaCompile = variant.javaCompile
    javaCompile.doLast {
        String[] args = ["-showWeaveInfo",
                         "-1.8",
                         "-inpath", javaCompile.destinationDir.toString(),
                         "-aspectpath", javaCompile.classpath.asPath,
                         "-d", javaCompile.destinationDir.toString(),
                         "-classpath", javaCompile.classpath.asPath,
                         "-bootclasspath", project.android.bootClasspath.join(File.pathSeparator)]
        log.debug "ajc args: " + Arrays.toString(args)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

完整配置参考 【AOP 面向切面编程】Android Studio 中配置 AspectJ ( 下载并配置AS中 jar 包 | 配置 Gradle 和 Gradle 插件版本 | 配置 Gradle 构建脚本 ) 博客 ;

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/120424496

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。