Java注解
1.注解的用处
-
编写文档:通过java doc命令生成doc文档 如
@Since、@Param -
代码分析:
-
编译检查:比如
@Override注解
2.JDK中自定义的注解
-
@Override :检测被该注解标出的方法是否是继承自父类或者父接口
安全检查: 防止在想要重写的时候因为 参数和方法名不正确等细节问题 而造成的重写失败
-
-
@SuppressWarnings : 设置警告的等级
3.自定义注解
注解的格式为 注解 + public @interface RestController {}
如果是JDK自带的注解 :那么他的格式是:元注解 + public @interface xxx{}
经过javap命令,对java字节码文件进行反编译;
注解
public @interface MyAnno{}
会变成
public interface MyAnno extends java.lang.annotation.Annotation{}
所以注解本质上就是一个接口;它继承了 java.lang.annotation.Annotation 这样一个接口,Annotation是所有注解类型的父接口,但是他Annotation的扩展并不一定是注解类型;而且Annotaion它自己本身不是注解类型,而是一个简单的接口
接口中可以定义成员属性,所以注解的内部也可以定义属性,但是注解类型对于内部方法的返回值有要求
要求一:
-
基本类型
-
String
-
枚举
-
注解
-
以上类型的数组
要求二:如果定义了属性,那么在使用该注解的时候需要给其属性进行赋值,赋值的类型就是方法的返回值类型 (如果在属性后面加上default “allen”,那么在使用注解的时候可以不赋值【简言之:属性要么给他赋值,要么使用默认值】)
要求三:如果注解只有一个属性值,并且属性名为value,那么在赋值时可以省略属性名【比如@SuppressWarnings("all")】
要求四:数组类型的属性赋值不是中括号而是大括号(数组成员只有一个时,可以省略大括号)
4.元注解
用来标注注解的元注解
-
@Target : 描述注解能够作用的位置
-
ElementType(枚举类型)取值
-
TYPE :本注解只能作用在类上
-
METHOD : 本注解只能作用在方法上
-
FILED : 本注解只能作用在成员变量 上
-
-
-
@Retention : 描述注解被保留的阶段
-
value
-
SOURCE :
-
CLASS :
-
RUNTIME : 本注解会保留到class文件中,并被JVM读取到
-
-
-
@Documented : 描述注解是否被抽取到doc文件中
-
doc文档中会不会显示注解(只有一个value,默认为true)
-
-
@Inherited : 描述注解是否被子类继承
-
本注解会自动被子注解继承(只有一个value,默认为true)
-
5.如何使用注解?
因为注解本身相当于一个只有字段的接口;
-
先获得被注解标注的对象,(这个对象可以时Class对象、Method对象和Field对象,对应的时注解标注的位置)
-
从上面这个对象使用 getAnnotation()方法,返回一个注解接口的实现类
-
调用第二部获得的实现类的抽象方法来获取配置的属性值
-

浙公网安备 33010602011771号