关于注解,经常用到,其实就是简化代码的一个东西而已,其一般步骤就是:
1、定义注解
2、使用注解
3、获取注解的值(Java反射)
4、用注解的值
注解的定义和接口的区别就是 在interface前面加上@符号 如下:
首先定义一个注解AClassAnnotation
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface AClassAnnotation {
int id() default -1;
String name();
}
标签分一些类型,不同的类型给Java中不同的地方标记,类型使用@Target
来设置,@Target 有下面的取值
- ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
- ElementType.CONSTRUCTOR 可以给构造方法进行注解
- ElementType.FIELD 可以给属性进行注解
- ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
- ElementType.METHOD 可以给方法进行注解
- ElementType.PACKAGE 可以给一个包进行注解
- ElementType.PARAMETER 可以给一个方法内的参数进行注解
- ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
@Retention
来控制标签的生命周期,其实就是你在什么时候去处理这个标签,处理完肯定不要了,不然占空间
- RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
- RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
- RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
定义一个用于成员变量字段的注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AFiledAnnotation {
int value();
}
定义一个TestActivity来使用注解去加载对应的控件
@AClassAnnotation(name = "test")
public class TestActivity extends AppCompatActivity {
@AFiledAnnotation(R.id.myTextView)
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
initAnnotation();
textView.setOnClickListener(new View.OnClickListener() {//此时已经完成了textView的初始化,所以可以直接设置控件的点击事件
@Override
public void onClick(View v) {
Toast.makeText(TestActivity.this, "点击了我", Toast.LENGTH_SHORT).show();
}
});
}
private void initAnnotation() {
Field[] fields=this.getClass().getDeclaredFields();
for (Field field:fields) {
field.setAccessible(true);//设置成员变量为可访问的
AFiledAnnotation aFiledAnnotation=field.getAnnotation(AFiledAnnotation.class);//获取该属性的注解对象
try {
field.set(this,findViewById(aFiledAnnotation.value()) );//设置该对象值 完成了对该对象的赋值
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
到这里你会发现其实 Butterknife的注解就是这么用的