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