## 代码结构
![](https://img.kancloud.cn/01/c8/01c8d0456046afa1f01b9616982902b7_529x312.png)
* butterknife ;android library model 提供android使用的API
* butterknife-annotations; java-model,使用时的注解
* butterknife-compiler;java-model,编译时用到的注解的处理器
* butterknife-gradle-plugin;自定义的gradle插件,辅助生成有关代码
* butterknife-integration-test;该项目的测试用例
* butterknife-lint;该项目的lint检查
* sample;demo
## annotations
### @Bind
~~~
@Retention(CLASS) @Target(FIELD)
public @interface Bind {
/** View ID to which the field will be bound. */
@IdRes int[] value();
}
~~~
### @OnClick
~~~
public @interface OnClick {
/** View IDs to which the method will be bound. */
@IdRes int[] value() default { View.NO_ID };
}
~~~
## compiler
源码咱们先忽略,主要使用javapoet生成代码,我们先看处理之后的效果
![](https://img.kancloud.cn/bc/56/bc56d4d25832e9e7b2a3ff0d33606b83_284x45.png)
**AnnotationActivity**
~~~
public class AnnotationActivity extends Activity
{
@Bind({2131558508})
Button button;
@OnClick({2131558508})
public void Onclick(){
Toast.makeText(this, "helloWorld", 0).show();
}
protected void onCreate(Bundle paramBundle) {
super.onCreate(paramBundle);
setContentView(2130968601);
ButterKnife.bind(this);
~~~
**生成的AnnotationActivity$$ViewBinder**
~~~
public class AnnotationActivity$$ViewBinder<T extends AnnotationActivity>
implements ButterKnife.ViewBinder<T>
{
public void bind(ButterKnife.Finder paramFinder, final T paramT, Object paramObject)
{
View localView = (View)paramFinder.findRequiredView(paramObject, 2131558508, "field 'button' and method 'Onclick'");
paramT.button = ((Button)paramFinder.castView(localView, 2131558508, "field 'button'"));
localView.setOnClickListener(new DebouncingOnClickListener()
{
public void doClick(View paramAnonymousView)
{
paramT.Onclick();
}
});
}
public void unbind(T paramT)
{
paramT.button = null;
~~~
## API
入口函数为ButterKnife.bind(this)
![](https://img.kancloud.cn/c8/0a/c80a7e52058aeeb45976d689f04431d1_862x709.png)
bind函数根据调用的类名查找其对应的className\_ViewBinding的类名,然后反射调用其构造函数。
## 参考资料
[深入理解ButterKnife源码并掌握原理(一)](https://blog.csdn.net/ta893115871/article/details/52497297)
[ButterKnife源码解析](https://www.jianshu.com/p/036a635da941)
- Android
- 四大组件
- Activity
- Fragment
- Service
- 序列化
- Handler
- Hander介绍
- MessageQueue详细
- 启动流程
- 系统启动流程
- 应用启动流程
- Activity启动流程
- View
- view绘制
- view事件传递
- choreographer
- LayoutInflater
- UI渲染概念
- Binder
- Binder原理
- Binder最大数据
- Binder小结
- Android组件
- ListView原理
- RecyclerView原理
- SharePreferences
- AsyncTask
- Sqlite
- SQLCipher加密
- 迁移与修复
- Sqlite内核
- Sqlite优化v2
- sqlite索引
- sqlite之wal
- sqlite之锁机制
- 网络
- 基础
- TCP
- HTTP
- HTTP1.1
- HTTP2.0
- HTTPS
- HTTP3.0
- HTTP进化图
- HTTP小结
- 实践
- 网络优化
- Json
- ProtoBuffer
- 断点续传
- 性能
- 卡顿
- 卡顿监控
- ANR
- ANR监控
- 内存
- 内存问题与优化
- 图片内存优化
- 线下内存监控
- 线上内存监控
- 启动优化
- 死锁监控
- 崩溃监控
- 包体积优化
- UI渲染优化
- UI常规优化
- I/O监控
- 电量监控
- 第三方框架
- 网络框架
- Volley
- Okhttp
- 网络框架n问
- OkHttp原理N问
- 设计模式
- EventBus
- Rxjava
- 图片
- ImageWoker
- Gilde的优化
- APT
- 依赖注入
- APT
- ARouter
- ButterKnife
- MMKV
- Jetpack
- 协程
- MVI
- Startup
- DataBinder
- 黑科技
- hook
- 运行期Java-hook技术
- 编译期hook
- ASM
- Transform增量编译
- 运行期Native-hook技术
- 热修复
- 插件化
- AAB
- Shadow
- 虚拟机
- 其他
- UI自动化
- JavaParser
- Android Line
- 编译
- 疑难杂症
- Android11滑动异常
- 方案
- 工业化
- 模块化
- 隐私合规
- 动态化
- 项目管理
- 业务启动优化
- 业务架构设计
- 性能优化case
- 性能优化-排查思路
- 性能优化-现有方案
- 登录
- 搜索
- C++
- NDK入门
- 跨平台
- H5
- Flutter
- Flutter 性能优化
- 数据跨平台