ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ButterKnife实现原理

2021-05-18 12:07:06  阅读:248  来源: 互联网

标签:实现 activity value field ButterKnife 处理器 注解 原理 BindView


代码自动生成

  • List item使用代码自动生成,一是为了提高编码的效率,二十避免在运行期大量使用反射,通过在编译期利用反射生成辅助类和方法以供运行时使用

注解处理器步骤

  • 在java编译器中构建
  • 编译器开始执行未执行过的注解处理器
  • 玄幻处理注解元素,找到被该住解所修饰的类,方法或者属性
  • 生成对应的类,并写入文件
  • 判断是否所有的注解处理器都已执行完毕,如果没有,继续下一个注解处理器的执行(回到步骤1)

注解处理器的实现

  • 主要需要两个库的AutoService和Javapoet,对所有的注解进行处理并生成以_BindView结尾的辅助类辅助类中是注解的实现(findViewByid,onCclick等)

  • 注解处理器需要实现AbstractProcessor接口,并实现对应的方法:init(),getSupportedSourceVersion(),getSupportedAnnotationTypes(),(返回所需要的处理的注解被process()方法接收), process() 方法必须实现,扫描所有备注接的元素并做处理,在这里完成了目标类信息的收集并生成对应 java 类,返回值类型是boolean,true表示该注解已被处理,不希望下一个注解处理器继续处理,false表示未被处理,下一个注解处理器继续处理

可用注解和反射实现

  • 拿BindView为例:首先创建BindView注解,参数为默认 int value()
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@interface BindView {
    int value();
}
  • 在相应的类中进行引用:
@BindView(R.id.text1)
TextView textView1;

@BindView(R.id.text2)
TextView textView2;
  • 通过反射进行绑定 ButterKnife.bind(this);
public static void bind(Activity activity) {
    bindView(activity);
}

//通过反射实现注解的绑定
public static void bindView(Activity activity) {
    try {
        // 获取字节码对象
        Class<? extends Activity> aClass = activity.getClass();

        // 获取全部变量
        Field[] fields = aClass.getDeclaredFields();

        // 遍历全部变量
        for (Field field : fields) {
            // 允许暴力反射
            field.setAccessible(true);

            // 获取带有注解BindView的变量
            BindView annotation = field.getAnnotation(BindView.class);

            if (annotation != null) {
                // 获取注解的值
                int value = annotation.value();
                View view = activity.findViewById(value);
                field.set(activity, view);
            }
        }
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}

标签:实现,activity,value,field,ButterKnife,处理器,注解,原理,BindView
来源: https://blog.csdn.net/datian1234/article/details/116982605

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有