Android自定义注解(一)

我们新建一个接口:

public interface BindView {
}

此时我们如果在interface前面加一个@符号,这个时候,就可以看到,IDE的文件符号已经变为了注解:

public @interface BindView {
}

接着,我们在注解上标明是用在哪里:

@Target(ElementType.FIELD)
public @interface BindView {
}

这样 ,我们就可以用在字段上了,比如我们在activity里这样使用:

public class MainActivity4 extends AppCompatActivity {

    @BindView
    TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main4);
    }
}

如果我想用在多种类型上呢?加个花括号:

@Target({ElementType.FIELD, ElementType.METHOD})

这个时候我们不仅可以用在字段上,还可以用在方法上:

public class MainActivity4 extends AppCompatActivity {

    @BindView
    TextView textView;

    @BindView
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main4);
    }
}

其实注解主要的作用是什么?主要用来标识。后续我们可以通过这个标识。来通过反射,或者注解器,对注解的东西进行获取。

接着,我们要来标记注解的生命周期:

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.SOURCE)
public @interface BindView {
}

这里,生命周期就有三种,SOURCE代表,仅仅在源码阶段标记,编译成CLASS文件就没有了。

CLASS阶段:如果是CLASS阶段,就会保留到编译后的CLASS文件。但是在JVM加载我们的CLASS文件后就不存在了。

RUNTIME阶段:所有的时期,注解信息都存在。

在往注解里添加一些东西:

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.SOURCE)
public @interface BindView {
    int value();
}

比如我们加了一个方法,返回值是Int.

那么 我们使用的时候,就需要传参数进去:

public class MainActivity4 extends AppCompatActivity {

    @BindView(1)
    TextView textView;

    @BindView(2)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main4);
    }
}

如果注解里写了多个方法:

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.SOURCE)
public @interface BindView {
    String value();
    int id();
}

使用:

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;

import com.example.myapplication.annotation.BindView;

public class MainActivity4 extends AppCompatActivity {

    @BindView(value = "text",id =1)
    TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main4);
    }
}

注解的作用到底用来干什么?

/**
 * 注解,单独是没意义的
 * 一般是注解+APT(注解处理器) 用于生成一些JAVA文件 比如butterknife dagger2 hilt
 * 注解+代码埋点 ASpectJ arouter
 * 注解+反射
 */

猜你喜欢

转载自blog.csdn.net/howlaa/article/details/129678888