注解简介
注解可以加在类上边,成员变量上,方法上,方法参数上.
注解是用来完成功能的,每一个注解都可以完成一些功能.
常用注解
@Override 检查方法是否是重写父类的方法
@FunctionalInterface 检查接口是否是函数式接口
@Deprecated 标注方法已经过时,不推荐使用
自定义注解
注意啊,interface前边有个@,这是自定义注解,不是接口。
public @interface Student{
String name(); //属性没有默认值,使用时必须指定值。
int age() default 0 ; //有默认值,使用时,可以不给,也可以给。
String[] hobbies(); //数组格式,按照数组格式赋值,只有一个时,可以省略大括号。
}
//这样使用。
@Student(name="小老犇",hobbies={"放牛","吃草"})
public void abc(){
sout("注解使用");
}
注解中属性的数据类型一共有三种:
- 八种基本数据类型(byte short int long float double boolean char)
- Class, String, 枚举, 注解
- 以上所有类型的类型数组。
元注解
元注解也是注解
元注解用来修饰注解的注解
元注解要加在注解上面 作用是对注解进行限制
@Target
限制注解的使用位置 。
@Target原理
@Target中只有一个属性叫做value.这个属性是ElementType[]
ElementType是一个枚举,枚举是一个特殊的类,枚举中每一个属性都是自身类型,枚举中的属性可以通过枚举名直接调用。
@Retention
限制注解的生命周期。
@Retention原理
@Retention只有一个属性叫做value,这个属性是RetentionPolicy类型,同样是枚举类型。
找一个经常使用的注解点进去,看看。
解析注解
解析注解,基于反射。解析注解时,需要使用Class对象和Method对象和Field对象,使用这些对象获取注解
而这些对象需要使用反射获取。
获取注解中的内容(比如属性),并进行处理.
Annotation接口 所有的注解默认实现该接口
AnnotatedElement 接口,里面定义了很多方法操作注解
相关API
getAnnotations() 获取所有注解
getAnnotation(Class annotationClass) 获取指定注解 传递哪个注解的Class,获取的就是谁的注解
boolean isAnnotationPresent(Class annotationClass) 判断指定注解是否存在,参数是注解的Class.
以上API的由谁来调用,要看这个注解注解的是类还是方法还是成员变量:
是类就用实例类的Class对象调用.获取该实体类上边的注解。
是方法就用Method对象调用。
是成员变量就用Field对象调用.。