methodinject
Introduction: MethodInject for Android 安卓 AOP 框架
Tags:
使用编译期注入字节码技术,无性能瓶颈
一行注解实现拦截,没有比这更简单的集成方式了
全面支持外部类、内部类、匿名内部类、类无限嵌套的方法的拦截
支持无限个拦截处理器
前言
在相当长的时间内,安卓开发领域,没有一个真正方便自由的 AOP 框架。有的方案或依赖于宿主框架、或依赖于多态,实现过程繁杂,无法真正做到与业务完全解耦,直到 MethodInject 诞生! MethodInject 是完全基于 APT+Gradle 开发的框架,它在编译期自动向您的 java 文件对应的 class 注入字节码,您无需关注性能问题; MethodInject 的使用方式及其简单,你只需在你需要处理拦截的方法上加上注解就可以实现自动拦截; MethodInject 开启了使用 java 代码动态编程的新纪元,比如,一些老旧的运行时注解方案可基于 MethodInject 改造成性能更好的框架。
【啰嗦一句,有网友问我:为什么只用 Gradle 插件就可以实现,为什么还要用 APT?原因是在 Gradle 插件中遍历所有目录的 class,同时还要遍历 class 中的 Method,性能开销太大,如果使用 APT 提前生成要处理的 class 表,那么在 Gradle 插件工作的时候就没那么费劲了。】
已知问题
1.方法参数中仅支持当前 Module 中(不含引用的其他 Module、jar、aar)、Android.jar 中、jre 中的 class 类型,如果超出该范畴会导致 inject 失败
使用方式
外部类
@InjectClass //拦截方法所属的类要加上 InjectClass 注解
public class A {
@Inject(TestInject.class) //加上 Inject 注解完成方法拦截 TestInject.class 为你自定义的拦截处理器
void goHome(){
}
}
内部类
public class A {
@InjectClass //拦截方法所属的类要加上 InjectClass 注解
class B{
@Inject({TestInject.class, TestInject2.class})
void hellow(){
}
}
}
匿名内部类及嵌套
@InjectClass //拦截方法所属的类要加上 InjectClass 注解
public class A {
void innerClassM(){
new Runnable(){
@Override
public void run() {
new Runnable(){
@Inject(TestInject.class) //只要你喜欢,怎么嵌套都行
@Override
public void run() {
}
};
}
};
}
}
InjectProcessor 处理器
//必须实现 InjectProcessor 协议
public class TestInject implements InjectProcessor {
//true:拦截 false:不拦截 (注意,如果你注入的方法有返回值的话,拦截会失效,但依然会执行这个方法)
@Override
public boolean intercept() {
return true;
}
}
集成方式
在 project 的 build.gradle 中使用 Gradle 插件
dependencies {
classpath 'com.fanjun:injectplugin:1.0.2'
}
在 Moudle 的 build.gradle 中使用 API 及 APT 处理器插件
dependencies {
implementation 'com.fanjun:methodinject:1.0.0'
annotationProcessor 'com.fanjun:methodinjectcompiler:1.0.0'
}
在 Moudle 的 build.gradle 中引用插件
apply plugin: 'com.fanjun.inject'
联系我
我的博客:https://blog.csdn.net/qwe112113215
我的邮箱:810343451@qq.com