Android开发教程:自定义注解如何自动生成代码

本文介绍了如何在Android开发中自定义注解,并通过代码示例展示了如何利用注解处理器生成与注解相关的代码。文章详细讲解了AbstractProcessor的实现,包括init、getSupportedAnnotationTypes和process方法,以及如何使用JavaPoet库来生成.java文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一期我们已经把butterknife-annotations中的注解变量都已经定义好了,分别为BindView、OnClick与Keep。

如果你是第一次进入本系列文章,强烈推荐查看

android开发教程:自定义注解之如何实现注解变量》这篇文章,要不然你可能会有点云里雾里。

如果在代码中引用的话,它将与开源库ButterKnife的操作类似。

reasonml
class MainActivity : AppCompatActivity() {
 
    @BindView(R.id.public_service, R.string.public_service)
    lateinit var sName: TextView
 
    @BindView(R.id.personal_wx, R.string.personal_wx)
    lateinit var sPhone: TextView
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Butterknife.bind(this)
    }
 
    @OnClick(R.id.public_service)
    fun nameClick(view: View) {
        Toast.makeText(this, getString(R.string.public_service_click_toast), Toast.LENGTH_LONG).show()
    }
 
    @OnClick(R.id.personal_wx)
    fun phoneClick(view: View) {
        Toast.makeText(this, getString(R.string.personal_wx_click_toast), Toast.LENGTH_LONG).show()
    }
}

使用@BindView来绑定我的View,使用@OnClick来绑定View的点击事件。使用Butterknife.bind来绑定该Class,主要是用来实例化自动生成的类。(该部分下篇文章将提及)

我们自己定义的绑定注解库已经完成了1/3,接下来我们将实现它的代码自动生成部分。这时就到了上期提到的第二个Module:butterknife-compiler。

android开发教程

**NameUtils**是一些常量的管理工具类。

arduino
final class NameUtils {
 
    static String getAutoGeneratorTypeName(String typeName) {
        return typeName + ConstantUtils.BINDING_BUTTERKNIFE_SUFFIX;
    }
 
    static class Package{
        static final String ANDROID_VIEW = "android.view";
    }
 
    static class Class {
        static final String CLASS_VIEW = "View";
        static final String CLASS_ON_CLICK_LISTENER = "OnClickListener";
    }
 
    static class Method{
        static final String BIND_VIEW = "bindView";
        static final String SET_ON_CLICK_LISTENER = "setOnClickListener";
        static final String ON_CLICK = "onClick";
    }
 
    static class Variable{
        static final String ANDROID_ACTIVITY = "activity";
    }
}

NameUitls包含了自动生成的类名称,包名,方法名,变量名。总之就是为了代码更健全,方便管理。

第二个类Processor是今天的重中之重。也是注解库代码自动生成的核心部分。由于注解的自动生成代码都是在注解进程中进行,所以这里它继承于**AbstractProcessor**,其中主要有三个方法需要实现。

1. init:初始化必要的数据
2. getSupportedAnnotationTypes:所支持的注解
3. process:解析注解,编写自动生成代码

init

从简单到容易,先是init方法,我们直接看代码

aspectj
    @Override
    public synchronized void init(ProcessingEnvironment processingEnv) {
        super.init(processingEnv);
        mFiler = processingEnv.getFiler();
        mMessager = processingEnv.getMessager();
        mEl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值