Android高级 ButterKnife编译时注解

ButterKnife使用方式
  • 第一步
    app/build.gradle配置
    implementation 'com.jakewharton:butterknife:9.0.0-rc1' //依赖
    annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0-rc1'//注解处理器

  • 第二步(可忽略)
    插件配置
    Android ButterKnife Zelezny

和IOC区别

APT的Element
APT的API
java library annotation
/**
 * ElementType
 *     TYPE, 类
 *     FIELD,
 *     METHOD,
 *     PARAMETER,
 *     CONSTRUCTOR,
 *     LOCAL_VARIABLE,
 *     ANNOTATION_TYPE,
 *     PACKAGE,
 *     TYPE_PARAMETER,
 *     TYPE_USE;
 * RetentionPolicy
 *     SOURCE, 源码
 *     CLASS, 编译时
 *     RUNTIME; 运行时
 */
@Target(ElementType.FIELD)//属性
@Retention(RetentionPolicy.CLASS)//编译时
public @interface BindView {
    //R.id.xx
    int value();
}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface OnClick {
    int value();
}
java library compiler

AnnotationProcessor
谷歌提供的注解服务,写在Build.gradle RC6是向下兼容的
compileOnly 'com.google.auto.service:auto-service:1.0-rc6'
annotationProcessor 'com.google.auto.service:auto-service:1.0-rc6'

package com.example.compiler;

import com.example.annotation.BindView;
import com.example.annotation.OnClick;
import com.google.auto.service.AutoService;

import java.lang.annotation.ElementType;
import java.util.HashSet;
import java.util.Set;

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Filer;
import javax.annotation.processing.Messager;
import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.Processor;
import javax.annotation.processing.RoundEnvironment;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.lang.model.util.Elements;

/**
 * 会全部扫描
 */
@AutoService(Processor.class)
public class ButterKnifeProcessor extends AbstractProcessor {

    private Elements elementTypeUtls;//提供操作Elcment的方法
    private Messager messager;//报告错误、警告及其他信息,在build过程中打印出来
    private Filer filter;//用来创建源文件


    @Override
    public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {

       Set<? extends Element> strings =  roundEnvironment.getElementsAnnotatedWith(BindView.class);
        return false;
    }

    @Override
    public synchronized void init(ProcessingEnvironment processingEnvironment) {
        super.init(processingEnvironment);
        elementTypeUtls = processingEnvironment.getElementUtils();
        messager = processingEnvironment.getMessager();
        filter = processingEnvironment.getFiler();

    }

    @Override
    public Set<String> getSupportedAnnotationTypes() {
        Set<String> stringSet = new HashSet<>();
        //支出注解的类型
        stringSet.add(BindView.class.getCanonicalName());
        stringSet.add(OnClick.class.getCanonicalName());
        return stringSet;
    }

    @Override
    public SourceVersion getSupportedSourceVersion() {
        return SourceVersion.latestSupported();
    }
}
android library library
package com.example.library;
import android.app.Activity;
public class ButterKnife {
    public static void bind(Activity target) {
        String clzName = target.getClass().getName() + "$ViewBinder";
        try {
            Class clz = Class.forName(clzName);
            //这个类时ViewBinder 的实现类
            ViewBinder obj = (ViewBinder) clz.newInstance();
            obj.bind(target);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
package com.example.library;
public interface ViewBinder<T> {
    void bind(T target);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值