注解(Java程序的一种特殊“注释”,用于工具处理的标注)
1.使用注解
a.含义
i.注解是放在类,字段,方法,参数前的一种特殊“注释”。
ii.注释会被编译器直接忽略,注解则可以被编译器打包带进class文件,因此,注解是一种用于标注的“元数据”。
iii.从JVM角度看,注解对代码逻辑没有任何影响,如何使用注解完全由工具决定。
b.三类注解
i.由编译器使用的注解,不会编译进.class文件,编译后被编译器扔掉;如:@Override、@SuppressWarnings。
ii.由工具处理.class文件使用的注解,有些工具在加载class的时候,对class动态处理实现特定功能。这类注解会被编译进.class文件,加载结束后不会加载进JVM,被底层库使用,无需处理。
iii.程序运行期读取的注解,加载后一直存在于JVM中,最常用的注解。(Java代码读取注解实现功能,JVM并不识别该注解)
c.注意
i.定义注解时,配置参数类型:
1.所有基本类型;
2.String;
3.枚举;
4.所有基本类型,String,枚举以及Class的数组。
ii.注解配置参数必须是常量,所以定义注解时就确定了所有参数的值,正常每个参数都有默认值,如果不设置就使用默认值。
iii.如果参数名称是value且只有一个参数,那么可以省略参数名称。
2.定义注解
a.含义
用@interface来定义注解。注解的参数类似无参方法,用default设定一个默认值(强烈推荐),最常用的参数应命名为value(有且只有它时可以省略参数名称)。
b.元注解(修饰其他注解的注解)
i.@Target(最常用)
定义源码被应用于哪些位置。
1.ElementType.TYPE:类或接口或枚举或Record。
2.ElementType.FIELD:成员变量字段。
3.ElementType.METHOD:方法。
4.ElementType.CONSTRUCTOR:构造方法。
5.ElementType.PARAMETER:方法参数。
6.ElementType.LOCAL_VARIABLE:局部变量。
7.ElementType.ANNOTATION_TYPE:注解。
8.ElementType.PACKAGE:包。
ii.@Retention(默认CLASS期间)
定义了注解的生命周期。
1.RetentionPolicy.SOURCE:仅编译期间。
2.RetentionPolicy.CLASS:仅class文件。
3.RetentionPolicy.RUNTIME:程序运行期(自定义常用!)
iii.@Documented
是否将注解信息添加到javadoc文档中。
iv.@Repeatable(注解可重复,不常用)
修饰的注解,可在同位置使用多个同样的注解。
v.@Inherited(继承)
定义子类是否可继承父类定义的注解。仅针对@Target(ElementType.TYPE)类型的注解有效,并且仅针对class的继承,对interface的继承无效。
c.如何定义注解
i.使用@interface定义注解类。
ii.添加参数、默认值;把最常用的参数定义为value(),所有参数都尽量设置默认值。
iii.添加元注解;必须设置@Targer和@Retention,@Retention一般设置为RUNTIME。
3.处理注解
a.注意
i.所有注解都是class,都继承自java.lang.annotation.Annotation。
ii.读取注解,要使用反射,反射API通过Class实例封装了类的所有信息。
b.获取注解
i.判断某个注解是否存在于Class、Field、Method或Constructor。
1.Class.isAnnotationPresent(注解.Class)
2.Field.isAnnotationPresent(注解.Class)
3.Method.isAnnotationPresent(注解.Class)
4.Constructor.isAnnotationPresent(注解.Class)
ii.用反射API获取注解。
1.Class.getAnnotation(注解.Class)
2.Field.getAnnotation(注解.Class)
3.Method.getAnnotation(注解.Class)
4.Constructor.getAnnotation(注解.Class)
c.使用注解
i.定义了注解,本身对逻辑程序没有任何影响,我们自己编写代码来使用注解,JVM不会自动给注解添加任何处理逻辑。
1.定义注解。
2.使用注解。
3.编写代码来使用注解。
4.常用注解
a.@RequestBody和@RequestParam()
i.@RequestParam()
1.一般与get请求一起使用,一个方法中可以有多个,用来接收普通参数。
2.加上该注解,表示参数必传,并且指定前端传过来的参数名。
3.可以通过required = false设置参数为非必传,非必传时可设置默认值defaultValue = "0"。
ii.@RequestBody
1.一般与post请求一起使用,一个方法中只能有一个,用来接收json格式的数据。
2.将json数据转化成Map形成的key-value键值对
iii.注意
1.如果不是放在请求体里可以用@RequestParam()接收,也可以什么都不写。