我们新建一个接口:
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
* 注解+反射
*/