文末有demo 代码链接 !!!
文章目录
1 背景
不知道你有没有想过以下问题:
ButterKnife为啥可以使用注解就可以直接帮我们生成对应的代码?
class ExampleActivity extends Activity {
@BindView(R.id.user) EditText username;
@BindView(R.id.pass) EditText password;
@BindString(R.string.login_error) String loginErrorMessage;
@OnClick(R.id.submit) void submit() {
// TODO call server...
}
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_activity);
ButterKnife.bind(this);
// TODO Use fields...
}
}
为啥ARouter使用注解就可以找到对应的路由页面?
@Route(path = "/test/activity")
public class YourActivity extend Activity {
...
}
没错,我们使用注解之后,注解器帮我们自动生成了一些模板代码,解放了我们的双手。
那么问题来了,我们能自己写一个注解器解放自己的双手吗?
就像下面这样,我使用Json注解,IDE 帮我们生成了TestModelBind类
下面开始进入正题!
2 步骤
2.1 新建一个Java Library 取名annotation
一定要注意!这里不是Phone Module 也不是 Android Library 而是 Java or Kotlin Library
这个类取名就叫做Json
2.2 Json类定义我们的注解
暂时不用管这个代码什么意思,直接复制粘贴到项目中即可
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.FIELD, ElementType.TYPE})
public @interface Json {
String value();
}
2.3 新建一个Java Library 取名compiler
其中的类取名就叫做JsonProcesser
和2.1 一样,注意是 Java or Kotlin Library
到此为止 项目结构如下:
目前出现了3个Module compiler/ annotation /app
2.4 项目切到project视图下
plugins {
id 'java-library'
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
api 'com.google.auto.service:auto-service:1.0-rc6'
annotationProcessor 'com.google.auto.service:auto-service:1.0-rc6'
api 'com.squareup:javapoet:1.10.0'
api project(':annotation')
}
大功告成,我们build一下