一般常见的注解有:
@Override 检测该注解标注的方法是否是继承自父类(接口)的
@Deprecated 表示已过时
@SuppressWarninngs 压制警告,eg:@SuppressWarnings("all") 在类前面加,整个类的警告被压制
自定义注解:
格式:
![](https://img.haomeiwen.com/i8429164/c9987069c718e95f.png)
本质:注解本质上就是一个接口,该接口默认继承Annotation接口
public interface MyAnno extends java.lang.annotation.Annotation{}
属性:接口中的抽象方法
要求:1.属性的返回值类型有下列取值
*基本数据类型
*String
*枚举
*注解
*以上类型的数组
eg:
![](https://img.haomeiwen.com/i8429164/1b34ebb447fb1b3c.png)
![](https://img.haomeiwen.com/i8429164/fdae6d1044bd7d6c.png)
![](https://img.haomeiwen.com/i8429164/9862a237498c556d.png)
2.定义了属性(方法),在使用时需要给属性赋值
(1) 如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
(2) 如果只有一个属性需要赋值,并且属性的名字是value,则value可以省略,直接定义值即可。
(3) 数组赋值时,值使用{}包裹。如果数组中值只有一个,则{}可以省略。
eg:
![](https://img.haomeiwen.com/i8429164/01cfc7790851dd5c.png)
![](https://img.haomeiwen.com/i8429164/78ab134b46ba6d8d.png)
元注解 :用于描述注解的注解
@Target:描述注解能够作用的位置
ElementType取值:TYPE:可以作用于类上;METHOD:可以作用于方法上;FIELD:可以作用于成员变量上。
@Retention:描述注解被保留的阶段
@Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class类字节码文件中,并被JVM读取到。(RetentionPolicy.SOURCE只在源码中,不会到字节码中,RetentionPolicy.CLASS会保留到class类字节码文件中,不会被JVM读取到,一般自定义注解用RUNTIME)
@Documented:描述注解是否被抽取到api文档中
@Inherited:描述注解是否被子类继承
eg:
![](https://img.haomeiwen.com/i8429164/172de0136cc0c57c.png)
![](https://img.haomeiwen.com/i8429164/f733cce08de578bb.png)
在程序使用(解析)注解:获取注解中定义的属性值
1.获取注解定义的位置的对象(类Class、方法Method、变量Field)
2.获取指定的注解 *用getAnnotation()
3.调用注解中的抽象方法获取配置的属性值
eg:通过注解和反射获取执行ToastDemo类的showToast()方法
![](https://img.haomeiwen.com/i8429164/fefae4c3e28126a8.png)
![](https://img.haomeiwen.com/i8429164/67ac1133ef550dc3.png)
![](https://img.haomeiwen.com/i8429164/b484df92e7420df0.png)
通过调用ReflectTest类中的runToastDemoMethod()就可以执行ToastDemo类的showToast()方法
网友评论