OOP(面向对象)
我们需要完成一个任务的时候一般都想着把 一些操作封装成一个类 ,所有的变量和操作都封装到一个类里面,那么这个类就是我们的对象, 我们要实现某个特定的功能,首先也想着在这个对象里面去实现
缺点
比如我们想实现某些不是常用的功能,我们需要去在需要的对象中去一一实现这些功能,并且我们要不断去维护这些功能,一旦多了我们就会很累的。
比如Android中一些按键统计、生命周期统计,特定统计都是比较琐碎的事情,要利用面向对象的思想去实现都不是很完美,这就要求去一一实现,显得很琐碎AOP(面向切面)
我在使用的时候是关注 具体的方法和功能切入点 ,不需要知道也不用关心所在什么类或者是什么对象,我们只关注功能的实现,具体对象是谁,不关心
java的动态代理:
有两个重要的类或接口
一个是 InvocationHandler(Interface)、另一个则是 Proxy(Class),我们可以自己写代码去定义自己的动态代理,去实现AOP,但是 太麻烦了 ,所以需要一个第三方工具
举一个 静态代理 的例子,快速理解代理
public interface HelloInterface { void sayHello(); } public class Hello implements HelloInterface{ @Override public void sayHello() { System.out.println("Hello zhanghao!"); } } public class HelloProxy implements HelloInterface{ private HelloInterface helloInterface = new Hello(); @Override public void sayHello() { System.out.println("Before invoke sayHello" ); helloInterface.sayHello(); System.out.println("After invoke sayHello"); } } //调用 HelloProxy helloProxy = new HelloProxy(); helloProxy.sayHello(); 结果: Before invoke sayHello Hello zhanghao! After invoke sayHello 复制代码
AOP方式对比选择
First Header | Hook时机 | Android中应用场景 | 优点 | 缺点 |
---|---|---|---|---|
Dexposed | 运行时动态hook | 滑动流畅度监控,事件执行监控,热修复 | 可以动态监控和系统通信的各种方法。 | 不支持5.0以上手机 |
Xposed | 运行时动态hook | 同Dexposed | 可以动态监控和系统通信的各种方法。 | 不支持5.0以上手机,必须root |
Java Proxy | 运行时动态hook | hook和系统通信接口例如:插件sdk | Java 原生API,没有兼容性问题 | 只能hook 有Interface的类 |
AspactJ | 编译时修改代码 | 统计方法执行时长,方法前后注入逻辑 | Sprint开源的AOP框架,功能强大。注解很多。基本包括所有的编译时注入方式 | 需要引入118K的jar |
ASM | 编译时修改代码 | 同上 | 字节码操作库 | 需要自己写注解和编译脚本。字节码插入编写比较费劲 |
Javassit | 编译时修改代码 | 同上 | 基于java反射的字节码操作类库。对比ASM,编写简单 | 对比ASM,修改类时,执行时间长 |
不过沪江科技开源了自己优化了的AspectJ, 支持Kotlin, 2.8K赞
gradle_plugin_android_aspectjx
不错的讲解
暂时不建议使用