Java 元注解
注解(Annotation)是一种可以放在 Java 类上,方法上,属性上,参数前面的一种特殊的注释,用来注释注解的注解叫做元注解。元注解我们平常不会编写,只需要添加到我们自己编写的注解上即可,。
Java 自带的常用的元注解有@Target
,@Retention
,@Documented
,@Inherited
分别有如下含义
@Target
:标记这个注解使用的地方,取值范围在枚举java.lang.annotation.ElementType
:TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE,ANNOTATION_TYPE,PACKAGE,TYPE_PARAMETER,TYPE_USE
。@Retention
:标识这个注解的生命周期,取值范围在枚举java.lang.annotation.RetentionPolicy
,SOURCE,CLASS,RUNTIME
,一般定义的注解都是在运行时使用,所有要用@Retention(RetentionPolicy.RUNTIME)
;@Documented
:表示注解是否包含到文档中。@Inherited
:使用@Inherited
定义子类是否可继承父类定义的Annotation
。@Inherited
仅针对@Target(ElementType.TYPE)
类型的annotation
有效,并且仅针对class
的继承,对interface
的继承无效。
定义注解
上面介绍了几个元注解,下面我们定义一个日志注解来演示一下,我们通过定义一个名为OperationLog
的注解来记录一些通用的操作日志,比如记录什么时候什么人查询的哪个表的数据或者新增了什么数据。编写注解我们用的是 @interface
关键字,相关代码如下:
package com.api.annotation; import java.lang.annotation.*; /** * <br> * <b>Function:</b><br> * <b>Author:</b>@author 子悠<br> * <b>Date:</b>2020-11-17 22:10<br> * <b>Desc:</b>用于记录操作日志<br> */ @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface OperationLog { /** * 操作类型 * * @return */ String type() default OperationType.SELECT; /** * 操作说明 * * @return */ String desc() default ""; /** * 请求路径 * * @return */ String path() default ""; /** * 是否记录日志,默认是 * * @return */ boolean write() default true; /** * 是否需要登录信息 * * @return */ boolean auth() default true; /** * 当 type 为 save 时必须 * * @return */ String primaryKey() default ""; /** * 对应 service 的 Class * * @return */ Class<?> defaultServiceClass() default Object.class; }
说明
上面的注解,我们增加了@Target({ElementType.METHOD})
, @Retention(RetentionPolicy.RUNTIME)
, @Documented
三个元注解,表示我们这个注解是使用在方法上的,并且生命周期是运行时,而且可以记录到文档中。然后我们可以看到定义注解采用的u是@interface
关键字,并且我们给这个注解定义了几个属性,同时设置了默认值。主要注意的是平时我们编写的注解一般必须设置@Target
和@Retention
,而且 @Retention
一般设置为RUNTIME
,这是因为我们自定义的注解通常要求在运行期读取,另外一般情况下,不必写@Inherited
。