一,前言
了解什么是注解,掌握三种内置注解,掌握元注解,掌握自定义注解
二,注解的概述
注解(Annotation)其实就是一种标记,但是它本身并不起任何作用,注解处理程序通过捕获被注解标记的代码然后进行一些处理,这就是注解工作的方式。
三,内置注解
JavaSE内置了三种注解。
-
@Override
定义在java.lang.Override中,表示声明是一个重写父类的方法,并监视验证方法名称是否为父类所有。
-
@Deprecated
定义在java.lang.Deprecated中,表示此方法已废弃、暂时可用,建议不要调用此方法。
-
@SuppressWarnings
定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息。
四,元注解
对注解进行注解,也就是对注解进行标记,对注解的行为做出一些限制,例如生命周期,作用范围等等。(定义在java.lang.annotation中)
1.@Target
用于描述注解的使用范围。
实例化:
@Target(ElementType.ANNOTATION_TYPE) public @interface Target { ElementType[] value(); }
ElementType类:
public enum ElementType { TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, ANNOTATION_TYPE,PACKAGE }
类型 | 作用的对象类型 |
---|---|
TYPE | 类、接口、枚举 |
FIELD | 类属性 |
METHOD | 方法 |
PARAMETER | 参数类型 |
CONSTRUCTOR | 构造方法 |
LOCAL_VARIABLE | 局部变量 |
ANNOTATION_TYPE | 注解 |
PACKAGE | 包 |
TYPE_PARAMETER | 1.8之后,泛型 |
TYPE_USE | 1.8之后,除了PACKAGE之外任意类型 |
2.@Retention
描述注解的生命周期,表示什么级别时注释存在。
实例化:
@Retention(RetentionPolicy.RUNTIME) public @interface Retention { RetentionPolicy value(); }
RetentionPolicy类:
public enum RetentionPolicy { SOURCE, CLASS, RUNTIME }
类型 | 作用 |
---|---|
SOURCE | 注解只在源码阶段保留,在编译器进行编译的时候这类注解被抹除,常见的@Override就属于这种注解 |
CLASS | 注解在编译期保留,但是当Java虚拟机加载class文件时会被丢弃,这个也是@Retention的「默认值」。@Deprecated和@NonNull就属于这样的注解 |
RUNTIME | 注解在运行期间仍然保留,在程序中可以通过反射获取,Spring中常见的@Controller、@Service等都属于这一类 |
3.@Documented
将注解的元素加入Javadoc中。
4.@Inherited
说明子类可继承父类中的该注解。
5.@Repeatable
表示该注解可以重复标记。
五,自定义注解
使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口。
-
@interface用来声明一个注解
-
方法名称就是配置参数
-
通过default声明参数的默认值
-
如果只有一个参数,通常参数名为value
例:
@Retention(RetentionPolicy.RUNTIME) public @interface PrintMsg { int count() default 1; String name() default "my name is PrintMsg"; } @PrintMsg(count = 2020) public class AnnotationTest { public static void main(String[] args) { //通过反射获取该注解 PrintMsg annotation = AnnotationTest.class.getAnnotation(PrintMsg.class); System.out.println(annotation.count()); System.out.println(annotation.name()); } }
输出如下:
2020 my name is PrintMsg