从无到有手写ButterKnife框架
2019-03-15 本文已影响0人
陈桐Caliburn
导航
一、代码的演进
二、butterKnife反射调用
三、javapoet自动生成模板代码
四、apt与注解
五、注解支持多层继承
六、apt调试
七、javapoet语法
1、注解支持多层继承,并且支持field相同去重
继承是树形结构

public class BaseActivity extends AppCompatActivity {
@ViewId(R.id.helloTv)
TextView helloTv;
}
public class MainActivity extends BaseActivity {
@ViewId( R.id.register )
Button register;
@ViewId( R.id.login )
Button login;
}
public class TestActivity extends MainActivity {
@ViewId( R.id.guess )
Button guess;
@ViewId( R.id.login )
Button helloTv;
}
上面的代码是常见情况
1、支持注解是继承关系
2、支持子类父类field相同,采用子类注解
public class ElementTree {
public ElementTree parentNode = null;
public List<ElementTree> childNodeList = new ArrayList<>( );
public TypeElement typeElement;
public List<Element> elementList;
public Set<String> fieldNameSets;
public String typeName;
public boolean isSorted;
}
1、思路我们可以获得Map<TypeElement,List<Element>> 当前类,当前类元素列表转换成List< ElementTree >
2、创建根节点 root
3、按照中序的方式(中左右)创建树形关系
4、遍历list< ElementTree > 每个元素,每个元素判断是否有父节点,按照子父排序方式获得所有元素列表List<List<Element>> ,Set<String>
5、用Set<String> 去重
详见算法
https://github.com/yinlingchaoliu/JavaPoetDemo/blob/master/poet-compiler/src/main/java/com/chaoliu/sort/ElementTree.java
https://github.com/yinlingchaoliu/JavaPoetDemo/blob/master/poet-compiler/src/main/java/com/chaoliu/sort/TreeUtils.java
关键在思路,不多于赘述