butterknife 源码分析,看完全都会了

本文深入剖析了ButterKnife的源码,讲解了其在编译时如何扫描注解并生成Java代码,以及如何进行findViewById和事件监听的设置。文章详细介绍了ButterKnife的流程,包括自定义注解、Processor解析器的工作原理,以及如何使用javapoet库生成Java代码。通过对BindView注解的解析,展示了ButterKnife如何处理注解信息并生成绑定代码的过程。
摘要由CSDN通过智能技术生成

View view;

target.title = Utils.findRequiredViewAsType(source, R.id.title, “field ‘title’”, TextView.class);

target.subtitle = Utils.findRequiredViewAsType(source, R.id.subtitle, “field ‘subtitle’”, TextView.class);

view = Utils.findRequiredView(source, R.id.hello, “field ‘hello’, method ‘sayHello’, and method ‘sayGetOffMe’”);

target.hello = Utils.castView(view, R.id.hello, “field ‘hello’”, Button.class);

view2130968578 = view;

view.setOnClickListener(new DebouncingOnClickListener() {

@Override

public void doClick(View p0) {

target.sayHello();

}

});

view.setOnLongClickListener(new View.OnLongClickListener() {

@Override

public boolean onLongClick(View p0) {

return target.sayGetOffMe();

}

});

view = Utils.findRequiredView(source, R.id.list_of_things, “field ‘listOfThings’ and method ‘onItemClick’”);

target.listOfThings = Utils.castView(view, R.id.list_of_things, “field ‘listOfThings’”, ListView.class);

view2130968579 = view;

((AdapterView<?>) view).setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> p0, View p1, int p2, long p
3) {

target.onItemClick(p2);

}

});

target.footer = Utils.findRequiredViewAsType(source, R.id.footer, “field ‘footer’”, TextView.class);

target.headerViews = Utils.listOf(

Utils.findRequiredView(source, R.id.title, “field ‘headerViews’”),

Utils.findRequiredView(source, R.id.subtitle, “field ‘headerViews’”),

Utils.findRequiredView(source, R.id.hello, “field ‘headerViews’”));

}

@Override

@CallSuper

public void unbind() {

T target = this.target;

if (target == null) throw new IllegalStateException(“Bindings already cleared.”);

target.title = null;

target.subtitle = null;

target.hello = null;

target.listOfThings = null;

target.footer = null;

target.headerViews = null;

view2130968578.setOnClickListener(null);

view2130968578.setOnLongClickListener(null);

view2130968578 = null;

((AdapterView<?>) view2130968579).setOnItemClickListener(null);

view2130968579 = null;

this.target = null;

}

}


ButterKnife 的执行流程


总的来说,大概可以分为以下几步:

  • 在编译的时候扫描注解,并做相应的处理,生成 java 代码,生成 Java 代码是调用 javapoet 库生成的。

  • 当我们调用 ButterKnife.bind(this); 方法的时候,他会根据类的全限定类型,找到相应的代码,并执行。完成 findViewById 和 setOnClick ,setOnLongClick 等操作。

第一步:在编译的时候扫描注解,并做相应的处理,生成 java 代码。这一步,可以拆分为几个小步骤:

  • 定义我们的注解,声明我们的注解是否保存到 java doc 中,可以作用于哪些区域(Filed ,Class等),以及是源码时注解,编译时注解还是运行时注解等)

  • 继承 AbstractProcessor,表示支持哪些类型的注解,支持哪些版本,

  • 重写 process 方法,处理相关的注解,存进 Map 集合中

  • 根据扫描到的注解信息(即 Map 集合),调用 javapoet 库生成 Java 代码。


butterknife-annotations 讲解


我们知道 ButterKnife 自定义很多的注解,有 BindArray,BindBitmap,BindColor,BindView 等,这里我们以 BindView 为例子讲解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值