文章目录
一、查看使用 AspectJ 后生成的 Class 字节码类
二、AspectJ 的本质
一、查看使用 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(); } }
二、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)
完整配置参考 【AOP 面向切面编程】Android Studio 中配置 AspectJ ( 下载并配置AS中 jar 包 | 配置 Gradle 和 Gradle 插件版本 | 配置 Gradle 构建脚本 ) 博客 ;