Java注解


Java注解

一,前言

? 了解什么是注解,掌握三种内置注解,掌握元注解,掌握自定义注解

二,注解的概述

? 注解(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

相关