methodinject

Introduction: MethodInject for Android 安卓 AOP 框架
More: Author   ReportBugs   
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
Apps
About Me
Google+: Trinea trinea
GitHub: Trinea