Collector是一个基于注解的类信息收集框架

网友投稿 764 2022-10-30

Collector是一个基于注解的类信息收集框架

Collector是一个基于注解的类信息收集框架

Nara(Android注解收集框架)

作者:戴益波

[TOC]

简介

Collector是一个基于注解的类信息收集框架。编码时将注解添加到类或方法上,运行时即可获取类或方法的信息了。收集到这些信息之后,可以完成其他上层框架的编写,例如EventBus基于注解的事件分发系统,Router的基于注解的路由框架等。

引用方式

Application&Library引入方式

项目根目录build.gradle中,添加公司maven仓库

allprojects { repositories { maven { url PUBLIC_REPOSITORY_URL } jcenter() }}// 其中:PUBLIC_REPOSITORY_URL=http://maven.daiyibo-/

项目根目录build.gradle中,添加gradle插件依赖

dependencies { classpath ('cn.daiyibo.android.annotation:nara-plugin:0.1.7') }

模块的build.gralde中,使用collector插件

apply plugin: 'plugin.nara'

Java-Library引入方式

项目根目录build.gradle中,添加公司maven仓库和gradle-plugin仓库

allprojects { repositories { maven { url PUBLIC_REPOSITORY_URL } jcenter() maven { url "https://plugins.gradle.org/m2/" } }}// 其中:PUBLIC_REPOSITORY_URL=http://maven.daiyibo-/

项目根目录build.gradle中,添加gradle插件依赖和apt插件依赖

dependencies { classpath ('cn.daiyibo.android.annotation:nara-plugin:0.1.7') classpath "net.ltgt.gradle:gradle-apt-plugin:0.6" }

模块的build.gralde中,使用apt插件和collector插件

// apt插件需要在collector插件之前,因为collect内部依赖apt插件apply plugin: "net.ltgt.apt"apply plugin: 'plugin.nara'

使用方法

Nara无需初始化操作,在首次调用Nara方法时,会借助类加载来进行初始化操作。Nara以静态方法为入口进行方法调用。类和方法的结构都通过接口展现,避免了对类和方法的数据修改操作。

默认注解

默认使用@Collect注解,@Collect注解存在value属性。

value:@Meta类型的数组,用于保存@Collect注解的额外信息

@Meta注解,以键值对的形式来存储@Collect的额外信息。name属性,表示Map-key。

// 类@Collect({ @Meta(name = "key1", booleans = true)})public class AnnotationBeanB extends AnnotationBeanA{}// 类@Collect({ @Meta(name = "key1", booleans = true)})public interface IAnnotationBeanD extends Serializable, Cloneable{}// 成员函数@Collect({ @Meta(name = "key1", booleans = true)})public T test2(int p1, String p2, AnnotationBeanB p3, T p4){ Log.e("daiyibo", "test2(" + "p1(" + p1 + "),p2(" + p2 + "),p3(" + p3 + "),p4(" + p4 + "));"); return p4;}// 静态函数@Collect({ @Meta(name = "key1", booleans = true)})public static T test2(int p1, String p2, AnnotationBeanB p3, T p4){ Log.e("daiyibo", "test2(" + "p1(" + p1 + "),p2(" + p2 + "),p3(" + p3 + "),p4(" + p4 + "));"); return p4;}

搜索类

用链式构造器的方式搜索类,通过group名,类的继承,类的注解这三个条件来进行搜索,获取符合条件类。还可以通过AnnotationFilter来自定义筛选类。

List listClass = Nara .findClass(Collect.class) // 查找类,参数为其所在注解 .withExtends(AnnotationBeanB.class, Cloneable.class) // 筛选条件:查找的类,需要继承AnnotationBeanB类和Cloneable接口 .withAnnotations(Collect.class, Country.class) // 筛选条件:查找的类,需要被@Collect和@Country所注解 .filter(new AnnotationFilter() { // 自定义筛选条件:return true 表示过滤掉当前类 @Override public boolean doFilter(ClassDesc obj) { return false; } }) .list(); // 返回符合条件的类集合

搜索函数

用链式构造器的方式搜索函数,通过group名,函数的注解这两个条件来进行搜索,获取符合条件函数。还可以通过AnnotationFilter来自定义筛选函数。

List listMethod = Nara .findMethod(Collect.class) // 查找函数,参数为其所在注 .withAnnotations(Collect.class, City.class) // 筛选条件:查找的函数,需要被@Collect和@City所注解 .filter(new AnnotationFilter() { // 自定义筛选条件:return true 表示过滤掉当前函数 @Override public boolean doFilter(MethodDesc obj) { return false; } }) .list(); // 返回符合条件的函数集合

自定义注解

Nara可以处理自定义注解,极大的扩展注解处理器的使用场景。**自定义注解,目前只支持添加到类和方法上。如果添加到其他位置,编译器会报错。**自定义注解支持SOURCE,CLASS,RUNTIME三种类型。

// 自定义注解@Retention(RetentionPolicy.SOURCE)@Target(ElementType.METHOD)@ShadowBindingpublic @interface City { String str1() default "";}// 使用方式和普通注解一样@City(str1 = "anything")public void test1() { Log.e("daiyibo", "test1()");`}

添加比较器工厂

比较器工厂保存在一个FILO队列中,最后添加工厂会最先获取。寻找比较器时,会根据FILO队列规则,依次从队列里面获取工厂,根据工厂获取比较器。如果当前工厂获取不到比较器,则继续到下一个工厂进行查找,直至遍历所有工厂。

// 添加比较器方法如下Nara.addComparatorFactory(new ComparatorFactory() { @Override public Comparator productClassComparator(String group, Class[] clazz, Class[] annotation){ // 如果当前工厂不存在符合条件的比较器,return null return new Comparator() { @Override public int compare(ClassDesc o1, ClassDesc o2) { if (o1.annotationClasses() != null && o2.annotationClasses() != null){ return o1.annotationClasses().size() - o2.annotationClasses().size(); } return 0; } }; }

Log日志说明

// 表示收集自定义注解的时间collector find custom annotation cost time:XXX sec// 表示APT生成代码的时间collect apt cost time: XXX sec// 表示收集APT生成类的时间collect class cost time: XXX sec

注意事项

API Level >= 16要求JDK 7及以上

致谢

gson,感谢gson提供的泛型支持方式VirtualAPK,感谢VirtualAPK提供的插件dependeny搜集方式

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:使用阿里云短信API接口
下一篇:计算包含+、-、*、/、(、)等几种运算符的表达式的值。
相关文章

 发表评论

暂时没有评论,来抢沙发吧~