这里以在Activity使用@BindView,onCreate方法中使用ButterKnife.bind(this)为例,进行讲解。
首先我们要了解的东西有两个
1.注解解释器AbstractProcessor,是一个用于处理注解的东西。不懂的自行百度。
2.javapoet,这是一个生成java文件的依赖
ButterKnife对应的注解解释器是ButterKnifeProcessor,在process方法中,将所有的信息放置在一个Map集合中,然后会使用javapoet进行java文件的生成,具体源码流程可以自行百度。
这里的JavaFile就是javapoet里面的,然后生成的java文件在这里
我们可以在这里看一下生成的java文件
这里生成了一个Activity类名+“_ViewBinding”的文件,其中findViewById操作是进行在Utils.findRequiredView()方法中的,我们通过@BindView进行注解的View就可以通过这个生成的java文件的构造方法进行findViewById,
在ButterKnife的注解解释器ButterKnifeProcessor中,我们只是创建了这个java文件(Activity类名+“_ViewBinding”),但是现在并没有这个这个类的实例化对象,那么什么时候才有这个生成的java类的实例呢?那就是在ButterKnife.bind(this);的时候。
可以看到生成的java文件是通过Activity对象打点调我们被BindView注解过的View,因为是打点调用,所以我们通过BindView注解的view就不能是私有的了,而应该是不写或者public。