APT(Annotation Processor Tool)
是用来处理注解的,即注解处理器。
APT
在编译器会扫描处理源代码中的注解,我们可以使用这些注解,然后利用
APT
自动生成
Java
代码,减少模板代码,提升编码效率,使源码更加简洁,可读性更高。
下面我将会以项目中常见的 intent 页面跳转为例,给大家演示一下,如何自动生成
intent
代码,以及对
getIntent
的参数自动赋值。
要实现上面这个功能我们需要了解
APT
、以及JavaPoet
。如果不太了解的同学可以先去了解一下。
常用写法
Intent intent = new Intent(this,OtherActivity.class); intent.putExtra("name",name); intent.putExtra("gender",gender); startActivity(intent);
数据获取
String name = getIntent().getStringExtra("name",name); String gender = getIntent().getStringExtra("gender",gender);
上述代码很必要但重复性又很高,写多了会烦,又浪费时间。并且在数据传递与获取时
key
值都需要保持一致,这又需要我们新建很多的常量。所以,这里我们希望上述的数据传递与获取可以自动生成。
为了实现这个需求,我们需要实现如下功能:
1)自动为
OtherActivity
类生成一个叫做
OtherActivityAutoBundle
的类
2)使用建造者模式为变量赋值
3)支持
startActivity
或
startActivityForResult
跳转
4)支持调用一个方法即可解析
Intent
传递的数据,并赋值给跳转的
Activity
中的变量
我们需要自动化如下代码:
new OtherActivityAutoBundle() .name("小明") .gender("男") .start(this);//或 startActivityForResult(this,requestCode)
在 OtherActivity 中,自动为变量赋值:
new OtherActivityAutoBundle().bindIntentData(this,getIntent());
a、创建一个 Java Library,并创建注解类
例如:
@Target(ElementType.FIELD) @Retention(RetentionPolicy.CLASS) public @interface AutoBundle { boolean exclude() default false;//不参与 intent、bundle 传值 boolean addFlags() default false;//添加 activity 启动方式 boolean isCloseFromActivity() default false;//是否关闭 FromActivity boolean isBundle() default false;//是否使用 Bundle 对象传值 boolean isSerializable() default false;//是否是 Serializable 类型 boolean isParcelable() default false;//是否是 Parcelable 类型 boolean isParcelableArray() default false;//是否是 ParcelableArray 类型 boolean isParcelableArrayList() default false;//是否是 ParcelableArrayList 类型 }
b、再创建一个 Java Library,并将上一步 Java Library 添加进来
此时,我们还需要在该 Library 中创建
resources
文件夹;接着在resources
中创建META-INF
和services
两个文件夹;然后在services
中创建一个名为javax.annotation.processing.Processor
的文件。最后在该文件中写入我们注解处理器的全路径。
这里我们也可以使用自动化工具
implementation 'com.google.auto.service:auto-service:1.0-rc2'
感兴趣的去搜一下具体用法